Geliştiriciler
iPhone Duo Size Class'ları: Kapalı, Yarı Açık ve Açık Duruşlar
iPhone Duo kapalı, yarı açık ve açıkken hangi size class'ları bildirir, neden yön yerine size class'a göre uyarlamalısınız ve SwiftUI ile UIKit kodu.
AppleDuo EditörlüğüYayınlanma 6 dk okuma
Bu sayfada
- iPhone Duo her duruşta hangi size class'ları bildirir?
- iPhone Duo'da neden ekran yönü yerine size class kullanmalısınız?
- SwiftUI'da size class'lar nasıl okunur?
- UIKit'te traitCollection ile size class'lar nasıl okunur?
- ArrangementView panelleri içinde size class'lar nasıl çalışır?
- Xcode Device Hub'da iPhone Duo duruşları nasıl test edilir?
- Önemli çıkarımlar
Uygulamanız iPhone Duo ile buluşmadan önce yalnızca tek bir değişikliğe vaktiniz varsa, bu size class'lar olsun. Cihazın iki ekranı ve birkaç duruşu var; her duruş uygulamanıza farklı miktarda alan veriyor. iPhone Duo size class'larını doğru ele almak, tek bir yerleşimin cihaz modeli için tek bir kontrol bile yapmadan hepsinde çalışmasını sağlar.
Kısa özet iOS geliştiricisi @sarunw'dan geliyor: katlıyken iPhone Duo bir iPhone, açıkken bir iPad. Bu yazı bunun her duruş için ne anlama geldiğini, ekran yönünün neden yanlış sinyal olduğunu ve size class'ların SwiftUI ile UIKit'te nasıl okunacağını açıklıyor. Buradaki her şey Apple'ın Tech Talk'larına, Apple'ın geliştirici forumlarına ve kaynak gösterilen geliştirici raporlarına dayanıyor. API'ler iOS 27.1 ve Xcode 27.1 ile geliyor; ayrıntılar sürümler arasında değişebilir.
iPhone Duo her duruşta hangi size class'ları bildirir?
Size class, uygulamanızın sahip olduğu alanın kaba bir tanımıdır: yatayda ve dikeyde compact veya regular. iPhone Duo'da kombinasyon hangi ekranın etkin olduğuna, bu da cihazın ne kadar açık olduğuna bağlıdır.
Apple'ın Prepare your app for iPhone Duo Tech Talk'unda dış ekran "diğer iPhone modelleri gibi davranır", iç ekran ise iki yönde de regular bildirir; bu da sidebar gibi içeriklere yer açar. @sarunw'nun dökümü yarı açık duruşu ve iki ekran yönünü de ekliyor:
| Duruş | Ekran | Yatay | Dikey | Neye benzer |
|---|---|---|---|---|
| Kapalı, dikey | Dış | Compact | Regular | Dikey tutulan iPhone |
| Kapalı, yatay | Dış | Compact | Compact | Yatay tutulan iPhone |
| Yarı açık, kitap gibi | İç | Regular | Regular | iPad |
| Açık, dikey | İç | Regular | Regular | iPad |
| Açık, yatay | İç | Regular | Regular | iPad |
Terimler hakkında bir not: @sarunw "folded" (katlı) kelimesini kapalı anlamında kullanıyor. Apple'ın Tech Talk'ları yarı açık duruş için "kitap gibi kısmen katlı" ifadesini kullanıyor. Bu yazıda "kapalı" dış ekranın kullanımda olduğu, "yarı açık" ise iç ekranın menteşeden büküldüğü durum anlamına geliyor.
Ölçek hakkında fikir vermesi için: Pasquale Pillitteri, dikeyde dış ekranı 466 × 678 point, iç ekranı 626 × 890 point olarak bildiriyor. Kodunuzu bu sayılara göre yazmamalısınız, ancak iç ekranın neden regular genişlik aldığını açıklıyorlar: dikeyde herhangi bir iPhone'dan daha geniş.
iPhone Duo'da neden ekran yönü yerine size class kullanmalısınız?
Ekran yönü eskiden "ikinci bir sütun için yer var mı?" sorusu için makul bir kısayoldu. iPhone Duo'da değil. Apple'ın önerisi net: yerleşim için yönü kontrol etmekten kaçının ve bunun yerine size class kullanın. İki gerçek, yönü burada güvenilmez kılıyor.
- İç ekran desteklenen yönlerinizi yok sayar. Apple, iç ekranın uygulamanızın desteklenen arayüz yönlerini dikkate almadığını söylüyor. Uygulamayı dikeye kilitlediyseniz ve yöne göre dallanıyorsanız, hiç planlamadığınız yerleşimlerle karşılaşırsınız.
- İç ekranda iki yön de regular'dır. İç ekranda dikey ve yatay aynı size class'ları bildirir; dolayısıyla yön kontrolü size ne kadar genişliğiniz olduğu hakkında hiçbir şey söylemez.
Apple'ın forum yanıtları cihaz kontrolleri hakkında da aynı şeyi söylüyor. Bir başlıkta bir DTS mühendisi şunu tavsiye etti: "belirli bir ekran üzerinden düşünmeyin, yalnızca yerleşiminizi yapmak için sahip olduğunuz kullanılabilir alanı düşünün." Bir diğerinde bir Apple evangelist'i cihaza özel mantıktan kaçınmayı, size class'ları benimsemeyi ve tüm yönleri desteklemeyi önerdi. Bu, iOS 27'nin artık iPad'de ve Mac'teki iPhone Mirroring'de yeniden boyutlandırabildiği iPhone uygulamalarını da kapsıyor.
Duruş için özel bir trait de yok. UITraitCollection'ın katlanmayı sunup sunmadığı sorulduğunda bir Apple mühendisi 848007 numaralı başlıkta şöyle yanıt verdi: "Bahsettiğiniz türde UITraitCollection trait'leri yok." Yerleşimi size class'lar belirler. Katlanmanın kendisini reserved region'lar ve hinge API'leri ele alır.
SwiftUI'da size class'lar nasıl okunur?
SwiftUI iki size class'ı da environment'a koyar. Bunları yerleşim kararını veren view'da okuyun; cihaz açıldığında, kapandığında veya döndüğünde SwiftUI o view'u yeniden çizer. Environment anahtarları, Apple'ın Tech Talk'ta gösterdikleriyle aynı.
struct LibraryView: View {
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
@Environment(\.verticalSizeClass) private var verticalSizeClass
var body: some View {
if horizontalSizeClass == .regular {
// İç ekran: liste ve detay yan yana sığar.
HStack(spacing: 0) {
AlbumList()
AlbumDetail()
}
} else {
// Dış ekran: herhangi bir iPhone gibi tek sütun.
AlbumList()
}
}
}
Bu örnek, yalnızca genişliğe bakarak tek sütunlu yerleşimi iki sütunlu bir yerleşimle değiştiriyor. Yükseklikle ilgili kararlar için dikey size class'ı kullanın; örneğin dış ekran yataydayken ve iki değer de compact olduğunda büyük bir başlığı gizlemek gibi.
Bunu elle yazmadan önce bir sistem container'ının bunu zaten yapıp yapmadığını kontrol edin. Apple, NavigationSplitView'un cihaz kapalıyken tek bir yığına daraldığını, açıkken sütunlarını yan yana dizdiğini veya üst üste bindirdiğini ve TabView'un tüm duruşlara uyum sağladığını belirtiyor. Uygulamanız bu container'ları kullanıyorsa size class işinin büyük kısmı sizin yerinize yapılmış demektir.
UIKit'te traitCollection ile size class'lar nasıl okunur?
UIKit'te size class'lar her view'un ve view controller'ın trait collection'ında bulunur: traitCollection.horizontalSizeClass ve traitCollection.verticalSizeClass. iOS 17'den itibaren, kullanımdan kaldırılan traitCollectionDidChange(_:)'i override etmek yerine trait değişikliklerine kaydolabilirsiniz.
final class LibraryViewController: UIViewController {
private let detailContainer = UIView()
private var listWidthConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
registerForTraitChanges(
[UITraitHorizontalSizeClass.self, UITraitVerticalSizeClass.self]
) { (self: Self, _: UITraitCollection) in
self.updateLayout()
}
updateLayout()
}
private func updateLayout() {
let isWide = traitCollection.horizontalSizeClass == .regular
detailContainer.isHidden = !isWide
listWidthConstraint.isActive = isWide
}
}
Burada controller, detay container'ını yalnızca genişlik regular olduğunda gösteriyor ve cihazın açılması gibi durumlarda size class'lardan biri değiştiğinde güncelleniyor. SwiftUI'da olduğu gibi, uygun olduğu yerlerde UISplitViewController ve UITabBarController'ı tercih edin; Apple bunların katlanmaya otomatik uyum sağladığını söylüyor.
Aynı Tech Talk'tan iki ilgili alışkanlık, size class tabanlı yerleşimlerin düzgün davranmasına yardımcı olur. UIScreen.main.scale yerine traitCollection.displayScale kullanın, çünkü iki ekranlı bir cihazda "ana ekran" belirsizdir. Ve her taraftaki safe area inset'lerini birbirinden bağımsız ele alın, çünkü iPhone Duo'da bunlar çoğu zaman eşit değildir.
ArrangementView panelleri içinde size class'lar nasıl çalışır?
iOS 27.1 ile gelen ArrangementView, alana ve duruşa bağlı olarak bir birincil ve bir ikincil view'u yan yana, üst üste yığılmış veya bindirilmiş olarak yerleştirir. Apple'ın Strike a pose with adaptive layouts on iPhone Duo sunumu, bir yerleşim için tarttığı girdileri anlatıyor: "view'un yatay ve dikey size class'ı", view'un en-boy oranı ve katlanma yeri gibi herhangi bir division region'ın etkin olup olmadığı.
Pratik çıkarım şu: bir panelin pencerenin değerlerini devraldığını varsaymak yerine size class'ları her panelin içinde okuyun. İç ekranın yarısını alan bir panelin genişliği, ekranın tamamından çok daha azdır. @sarunw, iPhone Duo'da her view'un aldığı size class'ların bir tablosunu yayımladı; bu bir görsel olduğu için, buradaki bir özete güvenmek yerine panel başına değerler için orijinal paylaşıma bakın.
Daralma da önemli. Bir Apple DTS mühendisi 847800 numaralı başlıkta, bölünme mevcut en-boy oranında, duruşta veya compact size class'ta karşılanamadığında ArrangementView'un "yalnızca tek bir view gösterecek şekilde daraldığını" açıkladı. Daha yüksek .layoutPriority'ye sahip view'u, varsayılan olarak da birincil view'u tutar. İkincil paneliniz temel kontrolleri barındırıyorsa, genişlik compact olduğunda kullanıcılara onlara ulaşmanın başka bir yolunu sunun.
struct EditorView: View {
var body: some View {
ArrangementView {
VideoPreview()
} secondary: {
EditingControls()
}
.arrangementViewStyle(.split)
}
}
struct VideoPreview: View {
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
var body: some View {
PreviewCanvas()
.toolbar {
if horizontalSizeClass == .compact {
// Kontrol paneli gizlenmiş olabilir; kontrolleri toolbar'dan sunun.
ToolbarItem { EditingControlsButton() }
}
}
}
}
ArrangementView ve .arrangementViewStyle(.split) çağrıları Apple'ın Tech Talk'ta sunduğu şekilde gösteriliyor. Compact genişlik için yedek çözüm, aynı forum başlığında önerilen yaklaşımı izliyor.
Xcode Device Hub'da iPhone Duo duruşları nasıl test edilir?
Size class'ları kontrol etmek için donanıma ihtiyacınız yok. Apple'ın Tech Talk'u adımları sıralıyor: Xcode 27.1'de iPhone Duo simülatörünü seçin, uygulamanızı Device Hub'da çalıştırın ve cihazı açmak, kapatmak, döndürmek veya katlamak için alttaki kontrol düğmelerini kullanın. Device Hub ve tam ekran deneyimi Xcode 27.1 gerektiriyor.
Yukarıdaki tablonun her satırını tek tek inceleyin. Her duruş için şunları doğrulayın:
- Yerleşim ekran yönüne değil, size class'lara uyuyor.
- Metinler ve kontroller yalnızca üstte ve altta değil, her tarafta safe area içinde kalıyor.
- Cihaz yarı açıkken önemli hiçbir şey katlanma yerinin üzerinde durmuyor.
- Durum geçişten sağ çıkıyor: kaydırma konumu, metin girişi ve mevcut seçim.
Ardından iç ekranda daha dar genişlikleri test edin. Apple, Split View çoklu görev moduna girmek için uygulamayı home indicator'dan tutup ekranın bir tarafına, sonra diğer tarafına sürüklemeyi öneriyor. Forumdaki DTS mühendisi, iç ekranda açık iki uygulamayı kontrol edilmesi gereken bir yapılandırma olarak özellikle vurguladı; çünkü uygulamanız o durumda regular genişliğin tamamından daha azını alır. @sarunw ayrıca Xcode 27.2'nin Device Hub'ının bellek baskısı, yavaş çekim animasyonlar, sallama ve düşme simüle edebildiğini belirtiyor; bu, geçiş sırasında ortaya çıkan hataların peşindeyken işe yarıyor.
Yarı açık duruş oyunlarda ekstra dikkat gerektirir. Regular genişlik bildiren bir duruş fiziksel olarak yine de ikiye bölünmüş olabilir; Greens Mini Golf gibi oyunlar tam olarak bunu kullanıyor: alt yarıda putting green, dik duran yarıda bir caddie kamerası. Size class'lar katlanma yerinin nerede olduğunu söylemez; bu, reserved region'ların ve hinge API'lerinin işidir.
Önemli çıkarımlar
- Kapalıyken iPhone Duo iPhone size class'larını bildirir: dikeyde compact genişlik ve regular yükseklik, yatayda iki yönde de compact.
- Yarı açık veya açıkken iç ekran, bir iPad gibi her iki yönde de regular genişlik ve regular yükseklik bildirir.
- Ekran yönüne veya cihaz modeline göre dallanmayın. İç ekran desteklenen yönleri yok sayar ve Apple kullanılabilir alana göre uyarlamayı öneriyor.
horizontalSizeClassveverticalSizeClassdeğerlerini SwiftUI environment'ından veya UIKit'tetraitCollection'dan okuyun ve zaten uyum sağlayan sistem container'larını tercih edin.- ArrangementView içinde size class'ları panel başına okuyun ve bölünmenin tek bir view'a daralmasını planlayın.
- Her duruşu ve Split View'u Xcode 27.1 ile Device Hub'da test edin.
Size class'lar ilk adım. Sırada, iPhone Duo dikey toolbar rehberimizde bar'ların ekranın kenarına nasıl taşındığını görün, iPhone Duo hazırlık kontrol listesinin tamamını uygulayın ya da menteşeyi zaten işe koşan oyunlara Built for the fold sayfasından göz atın.
Sık sorulan sorular
iPhone Duo'nun iç ekranı hangi size class'ı kullanır?
İç ekran, cihaz yarı açık da olsa tamamen açık da olsa, dikeyde ve yatayda regular yatay ve regular dikey size class bildirir. Bu, tam ekran bir iPad uygulamasının gördüğü kombinasyonun aynısıdır.
iPhone Duo'nun dış ekranı hangi size class'ı kullanır?
Dış ekran diğer iPhone modelleri gibi davranır. Dikeyde compact genişlik ve regular yükseklik, yatayda compact genişlik ve compact yükseklik bildirir.
Uygulamamı iPhone Duo'ya uyarlamak için ekran yönünü veya cihaz modelini mi kontrol etmeliyim?
Hayır. Apple, cihaza özel mantıktan ve yön kontrollerinden kaçınmayı, bunun yerine size class'lara ve kullanılabilir alana göre uyarlamayı öneriyor. İç ekran, uygulamanızın desteklenen arayüz yönlerini dikkate almaz; bu yüzden orada yön güvenilir bir yerleşim sinyali değildir.
iPhone Duo'nun katlanma durumu veya duruşu için bir UITraitCollection trait'i var mı?
Bir Apple mühendisi geliştirici forumlarında duruş için trait collection trait'leri olmadığını söyledi. Yerleşim için size class'ları, katlanma yeri için reserved region'ları, katlanma durumunun kendisine ihtiyacınız varsa da hinge API'lerini kullanın.
iPhone Duo size class'larını cihaz olmadan nasıl test ederim?
Uygulamanızı Xcode 27.1 gerektiren Device Hub'daki iPhone Duo simülatöründe çalıştırın. Simülatörün kontrolleri cihazı açar, kapatır, döndürür ve katlar; daha dar genişlikleri test etmek için uygulamayı iç ekranda Split View'a sürükleyebilirsiniz.
Kaynaklar
- Size classes on iPhone Duo: folded portrait, folded landscape, half-open and open · @sarunw on X
- Folded, iPhone Duo is an iPhone. Unfolded, it's an iPad. · @sarunw on X
- Start with size classes, layout margins and safe area insets · @sarunw on X
- Size classes of each view in ArrangementView on iPhone Duo · @sarunw on X
- Prepare your app for iPhone Duo · Apple Developer
- Strike a pose with adaptive layouts on iPhone Duo · Apple Developer
- Does the iPhone Duo inner display use a regular horizontal size class? · Apple Developer Forums
- Adapting an existing UIKit app for iPhone Duo at runtime · Apple Developer Forums
- Hinge articulation and UITraitCollection in custom view controllers · Apple Developer Forums
- How should ArrangementView behave across iPhone Duo display modes? · Apple Developer Forums
- iPhone Duo Apps, What Changes in Your Code and What to Do With Old Ones · Pasquale Pillitteri
Katlanmayı uygulamanızın bir parçası yapın.
iPhone Duo ile gerçekten bir şey yapan uygulama ve oyunları tanıtıyoruz. App Store bağlantısıyla sizinkini gönderin ya da diğer geliştiricilerin neler yaptığına bakın.