Geliştiriciler
SwiftUI'de ArrangementView: iPhone Duo'da Split ve Overlay Farkı
SwiftUI ArrangementView iPhone Duo'da birincil ve ikincil görünümü nasıl yerleştirir: split ve overlay stilleri, düzen oranları, menteşe ve panel başına boyut sınıfları.
AppleDuo EditörlüğüYayınlanma 7 dk okuma
Bu sayfada
- SwiftUI'de ArrangementView nedir?
- Uygulamama ArrangementView nasıl eklerim?
- Split mi overlay mı: hangi ArrangementView stilini kullanmalıyım?
- splitArrangementLayoutRatio iPhone Duo'da nasıl çalışır?
- Her ArrangementView paneli hangi boyut sınıflarını alır?
- ArrangementView mi NavigationSplitView mi: hangisini ne zaman kullanmalıyım?
- Önemli çıkarımlar
Pek çok ekran aslında birbirine ait iki görünümden oluşur: bir oynatıcı ve sırası, bir sohbet ve fotoğrafları, bir podcast ve dökümü. Normal bir iPhone'da bunları alt alta dizersiniz. iPhone Duo'nun iç ekranında ise yan yana olmalarını istersiniz; biri cihazı yarıya kadar katladığında da hiçbir görünüm katlama çizgisinin üzerine denk gelmemeli. SwiftUI'deki ArrangementView, Apple'ın bu soruna verdiği yanıt. Bu rehber ne yaptığını, iki stilini, menteşe çevresinde boyutlandırmanın nasıl işlediğini ve bunun yerine ne zaman NavigationSplitView'a başvurmanız gerektiğini anlatıyor.
ArrangementView, stilleri ve boyutlandırma değiştiricileri Apple'ın belgelerinde iOS 27.1 ve sonrasında kullanılabilir olarak listeleniyor; tam iPhone Duo deneyimi için derleme yapmak üzere Xcode 27.1'e ihtiyacınız var. Bu API'ler yeni olduğu için ayrıntılar sürümler arasında değişebilir. Aşağıdaki her şey Apple'ın belgelerinden, Strike a pose with adaptive layouts on iPhone Duo Tech Talk'undan ve iOS geliştiricisi Sarun Wongpatcharapakorn'un (@sarunw) paylaşımlarından derlendi. Bu kodu kendimiz donanım üzerinde çalıştırmadık.
SwiftUI'de ArrangementView nedir?
ArrangementView, tam olarak iki görünüm (bir birincil ve bir ikincil) barındıran ve bunları sizin yerinize yerleştiren bir kapsayıcıdır. Apple, Tech Talk'ta arrangement'ları navigasyon kapsayıcıları ile içerik kapsayıcıları arasında duran yeni bir katman olarak tanımlıyor.
Bir arrangement'ı yöneten kurallar üç girdiye bakar: görünümün yatay ve dikey boyut sınıfı, en-boy oranı ve etkin bir bölme bölgesi (division region) olup olmadığı. iPhone Duo'da bölme bölgesi katlama yeridir. Arrangement bu girdilere göre her görünümün görünüp görünmeyeceğine ve hangi çerçeveyi alacağına karar verir. HStack veya VStack ile temel fark da bu: bir stack her alt öğesini her zaman gösterir, bir arrangement ise yer olmadığında ikincil görünümü gizleyebilir. Bir Apple mühendisi geliştirici forumlarında bu daralmanın beklenen davranış olduğunu doğruladı.
UIKit'te aynı kavram, bir birincil ve bir ikincil view controller alan UIArrangementViewController ile karşılanıyor. Bu yazı SwiftUI'ye odaklanıyor.
Uygulamama ArrangementView nasıl eklerim?
Bir arrangement'ı iki sondaki closure ile oluşturur ve bir navigasyon kapsayıcısının içine yerleştirirsiniz. Apple'ın Tech Talk'ta kullandığı yapı şöyle:
var body: some View {
NavigationStack {
ArrangementView {
PlayerView()
} secondary: {
UpNextView()
}
}
}
İlk closure birincil görünüm, secondary: closure'ı ise ikincil görünüm. Sarun'un diyagramları bunlara "First View" ve "Secondary View" diyor; aynı şey.
Yerleşim önemli. ArrangementView kendi navigasyonunu sağlamaz; bu yüzden navigasyon onun içinde değil, çevresinde olmalı. Apple'ın belgeleri ayrıca bir arrangement'ı scroll view, list, grid veya navigation split view içine koymaktan ve bir arrangement içine navigation split view veya tab view koymaktan kaçınmanızı söylüyor.
Stil seçmek için arrangementViewStyle(_:) uygulayın. Bir arrangement'ın kullandığı eksenleri de sınırlayabilirsiniz:
ArrangementView {
NowPlayingView()
} secondary: {
LyricsView()
}
.arrangementViewStyle(.split.axes(.horizontal))
Dışarıda bıraktığınız her eksende arrangement yalnızca birincil görünümü gösterir.
Split mi overlay mı: hangi ArrangementView stilini kullanmalıyım?
İki stil var. Varsayılan stil split'e çözümlenir, overlay ise alternatiftir. Bazı duruşlarda aynı, bazılarında çok farklı davranırlar. Aşağıdaki terimler cihazı izliyor: kapalı, dış ekranı kullandığınız anlamına gelir; yarı açık, iç ekranda kısmen katlanmış hâl; açık ise düz hâl.
| Duruş | Split stili | Overlay stili |
|---|---|---|
| Kapalı, dikey | Birincil üstte, ikincil altta | Birincil, ikincilin üzerine bindirilmiş |
| Kapalı, yatay | Yalnızca birincil | Birincil, ikincilin üzerine bindirilmiş |
| Yarı açık, kitap gibi | Yan yana, birincil başta (leading) | Yan yana, birincil sonda (trailing) |
| Yarı açık, dizüstü bilgisayar gibi | Alt alta, birincil üstte | Alt alta, birincil altta |
| Açık, yatay | Yan yana, birincil başta (leading) | Birincil, ikincilin üzerine bindirilmiş |
| Açık, dikey | Alt alta, birincil üstte | Birincil, ikincilin üzerine bindirilmiş |
Sarun split'i şöyle özetliyor: "her görünümü yan yana koymaya çalışır" ve yeterli alan yoksa yalnızca ilk görünüm gösterilir. Overlay ise "çoğu zaman iki görünümü üst üste dizer" ve katlanmış hâlde ikisi yan yana durur, First View sağda olur; bu, split'in tam tersi. Apple'ın belgeleri de aynı yerleşimi tarif ediyor: katlanmış yatay duruşta overlay ikincil görünümü başa (leading), birincil görünümü sona (trailing) koyar. Bunu tersine çevirmek için birincil görünüme overlayArrangementEdge(.leading) uygulayın.
Apple'ın seçim yönergesi basit. Hiçbir görünümün örtülmemesi gereken ana görünüm ve ayrıntı ilişkisinde (örneğin bir podcast ve dökümü) split kullanın. Belirgin bir ön plan ve arka plan olduğunda (örneğin bir videonun üzerindeki oynatma kontrolleri) overlay kullanın. Mevcut düzeniniz bir HStack veya VStack ise doğal karşılığı split. ZStack ise overlay kullanın.
Overlay arrangement'ta bir görünüm kendi yığın konumunu okuyup sunumunu değiştirebilir. Tech Talk, değer sıfırdan büyük olduğunda görünümü daraltılmış bir biçime geçiriyor:
struct PlayerControls: View {
@Environment(\.overlayArrangementZIndex)
private var zIndex: Int
var body: some View {
ControlsPanel(isCollapsed: zIndex > 0)
}
}
ControlsPanel burada sizin kendi görünümünüzü temsil ediyor.
splitArrangementLayoutRatio iPhone Duo'da nasıl çalışır?
Varsayılan olarak bir split arrangement iki görünümü eşit boyutlandırır. Bunu değiştirmek için görünümlerden birine splitArrangementLayoutRatio(_:) uygulayın. Sıfır ile bir arasında isteğe bağlı bir CGFloat alır. Apple'ın örneği şu:
ArrangementView {
ConversationView()
.splitArrangementLayoutRatio(0.3)
} secondary: {
PhotosView()
}
.arrangementViewStyle(.split.axes(.horizontal))
Arrangement önce en yüksek layoutPriority değerine sahip görünümü, onun oranını kullanarak boyutlandırır. Bu oran kalan alandan fazlasını isterse görünüm bunun yerine kalan alanı alır. Oranlar boş alan bırakırsa yüksek öncelikli görünüm o alanı dolduracak şekilde büyür. Apple ayrıca minimum, ideal ve maksimum oranlar için ilgili değiştiricileri, splitArrangementLayoutSize ile açık boyutları ve splitArrangementFixedLayoutSize değiştiricisini belgeliyor.
Önemli bir istisna var. Sarun, yarı açık bir iPhone Duo'da splitArrangementLayoutRatio değerinin yok sayıldığını ve bölmenin her zaman yarı yarıya menteşenin üzerinde durduğunu bildiriyor. Bu mantıklı: 30/70'lik bir bölme, panellerden birinin kenarını katlama çizgisinin üzerine denk getirirdi. Oranınızı düz ekran için tasarlayın ve cihaz katlıyken eşit bir bölme bekleyin. Bu davranışın Apple'ın belgelerinde yazdığını bulamadık; iOS 27.2'de gözlemlenmiş bir davranış olarak değerlendirin.
Eşit bölme, eşit panel boyutu anlamına gelmez. Sarun'un yatay konumda yarı açık bir cihaz diyagramında ekranın her yarısı 475 punto ve durum çubuğu sağ kenar boyunca 84 punto yer kaplıyor. Sonuç olarak ikincil panel daha dar çıkıyor. İki panelin eşleştiğini varsaymak yerine her zaman size verilen boyuta göre düzen kurun.
Katlama yerinin kendisinin nasıl bildirildiğini öğrenmek için ayrılmış bölgelerin iPhone Duo katlama yerini nasıl tanımladığına bakın.
Her ArrangementView paneli hangi boyut sınıflarını alır?
Bir arrangement'taki her panel kendi boyut sınıflarını alır ve bunlar çoğu zaman pencereninkinden farklıdır. Sarun bunları iOS 27.2'de ölçtü. H yatay, V dikey anlamına geliyor.
| Duruş ve düzen | İlk görünüm (H/V, punto) | İkincil görünüm (H/V, punto) |
|---|---|---|
| Kapalı, dikey, alt alta | Compact/Compact, 382 × 322 | Compact/Compact, 382 × 322 |
| Kapalı, yatay | Compact/Compact, 594 × 432 | Gizli |
| Yarı açık, dikey, katlama yeri boyunca alt alta | Regular/Compact, 669 × 373 | Regular/Compact, 669 × 421 |
| Yarı açık, yatay, yan yana | Compact/Regular, 455 × 635 | Compact/Regular, 371 × 635 |
| Açık, dikey, alt alta | Regular/Compact, 669 × 417 | Regular/Compact, 669 × 417 |
| Açık, yatay, yan yana | Compact/Regular, 433 × 635 | Compact/Regular, 433 × 635 |
Buradan iki kural çıkıyor. Birincisi, bölme ekseni compact olur: yan yana düzen her panele compact bir genişlik, alt alta düzen ise compact bir yükseklik verir. İkincisi, iç ekranda (yarı açık veya açık) paneller, iPad'deki bir ArrangementView ile aynı boyut sınıflarını alır.
Yani regular genişlikteki bir iç ekranda duran bir panel yine de compact yatay boyut sınıfı bildirebilir. Her paneli kendi ortamına yanıt verecek şekilde oluşturun ve panelin içinden pencerenin özelliklerini (traits) okumayın. Pencere düzeyindeki değerler için iPhone Duo boyut sınıfları yazımıza bakın.
Bölme yönünü doğrudan da okuyabilirsiniz. splitArrangementAxis ortam değeri bir split arrangement içinde .horizontal veya .vertical, dışında ise nil olur. Apple'ın örneği bunu bir panelin iç düzenini değiştirmek için kullanıyor:
struct DetailsView: View {
@Environment(\.splitArrangementAxis) var axis
var body: some View {
let layout: AnyLayout = axis == .horizontal
? AnyLayout(VStackLayout())
: AnyLayout(HStackLayout())
layout {
Artwork()
Metadata()
}
}
}
İkincil görünüm gizlendiğinde kontrolleri de onunla birlikte gider. Bir Apple mühendisi forumlarda, hayatta kalanın o olması için temel görünüme daha yüksek bir layoutPriority vermeyi önerdi. Bu durumda ikincil içeriğe ulaşan bir düğme veya sheet eklemek de isteyebilirsiniz.
ArrangementView mi NavigationSplitView mi: hangisini ne zaman kullanmalıyım?
Farklı sorunları çözerler ve iç içe kullanılmak üzere tasarlanmamışlardır.
| NavigationSplitView | ArrangementView | |
|---|---|---|
| Ne barındırır | Navigasyon sütunları (kenar çubuğu, içerik, ayrıntı) | İlişkili iki içerik görünümü |
| Navigasyon | Evet, bir navigasyon kapsayıcısıdır | Yok; bir navigasyon kapsayıcısının içine yerleştirin |
| Dış ekranda | Tek bir yığına daralır | Split dikeyde alt alta dizer, yatayda yalnızca birincili gösterir; overlay görünümleri üst üste bindirir |
| Katlama yerinde | Otomatik olarak uyum sağlar | Her görünümü kendi tarafında tutar |
| Boyut kontrolü | Sütun genişlikleri | Oranlar, boyutlar ve düzen önceliği |
Görünümler navigasyon düzeyleri olduğunda (örneğin bir e-posta listesi ve seçili e-posta) NavigationSplitView kullanın. Apple'ın tasarım yönergeleri split view'ların iç ekranda genişlediğini, dış ekranda tek panele daraldığını ve katlama yerine kendiliğinden uyum sağladığını söylüyor. Uygulamanız zaten bir tane kullanıyorsa ArrangementView'a hiç ihtiyacınız olmayabilir.
ArrangementView'u, tek bir hedef içinde aynı ekranda yaşayan iki görünüm için kullanın. Bir video ve kontrolleri, bir tarif ve zamanlayıcısı ya da bir oyun tahtası ve skor tablosu iyi örnekler. Apple'ın iPhone Duo tasarım yönergelerindeki kalıplardan biri masa üstü duruşu: uzaktan görülmekten fayda sağlayan içerik dik duran yarıya, kontroller ise düz yatan yarıya gider. Built for the Fold sayfamızdaki oyunlar bu düzenin ne kadar güçlü olabileceğini gösteriyor.
UIKit'te aynı tavsiye UISplitViewController ve UIArrangementViewController için de geçerli. Bir Apple evangelist'i forumlarda, Apple'ın bir UINavigationController öğesini UIArrangementViewController içine gömmeyi önermediğini belirtti.
Önemli çıkarımlar
- iOS 27.1 ile gelen ArrangementView, birincil ve ikincil bir görünümü boyut sınıflarına, en-boy oranına ve katlama yerine göre yerleştirir. Bir stack'ten farklı olarak ikincil görünümü gizleyebilir.
- Split iki görünümü ayrı alanlarda tutar ve bölünemediğinde yalnızca birincili gösterir. Overlay düz ekranda görünümleri üst üste bindirir ve katlama yerinde birincil sonda (trailing) olacak şekilde ayırır.
splitArrangementLayoutRatiodüz ekrandaki düzeni şekillendirir. Sarun'a göre yarı açık bir iPhone Duo'da yok sayılıyor ve bölme menteşenin üzerinde duruyor.- Her panel kendi boyut sınıflarını alır ve bölme ekseni compact olur. Ortamı her panelin içinden okuyun.
- ArrangementView'u bir navigasyon kapsayıcısının içine koyun; asla bir list, scroll view veya NavigationSplitView içine koymayın.
Sırada, menteşenin kendisine nasıl tepki vereceğinizi iPhone Duo menteşe durumları ve onHingeChange yazısında öğrenin ya da iPhone Duo uygulama hazırlık kontrol listesini tamamlayın.
Sık sorulan sorular
SwiftUI'de ArrangementView nedir?
ArrangementView, iOS 27.1'de tanıtılan ve birincil ile ikincil bir görünüm barındıran bir SwiftUI kapsayıcısıdır. Boyut sınıflarını, en-boy oranını ve iPhone Duo katlama yeri gibi bir bölme bölgesinin etkin olup olmadığını kullanarak her görünümün görünüp görünmeyeceğine ve nerede duracağına karar verir.
ArrangementView'un split ve overlay stilleri arasındaki fark nedir?
Split stili her görünüme her zaman kendi alanını verir; görünümler yan yana veya alt alta durur ve bölünemediğinde yalnızca birincil görünüm gösterilir. Overlay stili düz bir ekranda birincil görünümü ikincilin üzerine bindirir, cihaz kısmen katlandığında ise görünümleri katlama yerinin iki karşı tarafına taşır.
splitArrangementLayoutRatio yarı açık bir iPhone Duo'da çalışıyor mu?
iOS geliştiricisi Sarun Wongpatcharapakorn'a göre hayır. Yarı açık bir iPhone Duo'da oran yok sayılıyor ve bölme yarı yarıya menteşenin üzerinde duruyor. Oran, ekran düzken uygulanıyor.
ArrangementView içine NavigationSplitView koymalı mıyım?
Hayır. Apple'ın belgeleri bir arrangement view içine navigation split view veya tab view koymaktan, bir arrangement view'u da scroll view, list veya navigation split view içine koymaktan kaçınmanızı söylüyor. Bunun yerine arrangement'ı NavigationStack gibi bir navigasyon kapsayıcısının içine koyun.
ArrangementView'un UIKit karşılığı nedir?
UIKit, UIArrangementViewController kullanıyor. Apple'ın iPhone Duo için uyarlanabilir düzenler Tech Talk'unda gösterildiği gibi, birincil ve ikincil yerleşimler için birer view controller atarsınız ve düzeni updateArrangement ile seçersiniz.
Kaynaklar
- Strike a pose with adaptive layouts on iPhone Duo (Tech Talk) · Apple Developer
- ArrangementView · Apple Developer Documentation
- splitArrangementLayoutRatio(_:) · Apple Developer Documentation
- SplitArrangementViewStyle · Apple Developer Documentation
- OverlayArrangementViewStyle · Apple Developer Documentation
- Prepare your app for iPhone Duo (Tech Talk) · Apple Developer
- Designing for iPhone Duo · Apple Human Interface Guidelines
- Designing for iPhone Duo · Blake Crosley
- How should ArrangementView behave across iPhone Duo display modes? · Apple Developer Forums
- Split style ArrangementView: side by side, or only the first view · @sarunw on X
- Overlay style ArrangementView: side by side in a fold, First View on the right · @sarunw on X
- splitArrangementLayoutRatio is ignored on a half-open iPhone Duo · @sarunw on X
- Size classes of each view in ArrangementView on iPhone Duo · @sarunw on X
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.