Geliştiriciler
iPhone Duo Dikey Toolbar: Bar'lar Kenara Nasıl Taşınır?
iPhone Duo dikey toolbar nasıl çalışır: bar'lar ne zaman dikey olur, semboller ve başlıklar, görünürlük önceliği, sabitlenen eylemler, devre dışı bırakma ve özel bar'lar.
AppleDuo EditörlüğüYayınlanma 6 dk okuma
Bu sayfada
- iPhone Duo'daki dikey bar nedir?
- iPhone Duo'da toolbar ne zaman dikey olur?
- Dikey bar neden başlıklar yerine sembolleri öne çıkarır?
- visibilityPriority ile taşma nasıl kontrol edilir?
- topBarPinnedTrailing ile Done nasıl sabitlenir ve öğeler nasıl sıralanır?
- iPhone Duo'da dikey bar nasıl devre dışı bırakılır?
- Özel toolbar'lar ve RTL yerleşimleri bar'ı neden taşımaz?
- Önemli çıkarımlar
Uygulamanızı iOS 27.1 SDK ile yeniden derleyip iPhone Duo'da çalıştırdığınızda navigation bar ve toolbar artık üstte ve altta değildir. Bunun yerine ekranın bir tarafı boyunca uzanan bir sütunda dururlar. Apple'ın vertical bar (dikey bar) adını verdiği bu iPhone Duo dikey toolbar, çoğu uygulamanın yeni cihazda karşılaştığı en büyük görsel değişikliktir ve büyük kısmı otomatik olarak gerçekleşir.
Otomatik olması zahmetsiz olduğu anlamına gelmez. Dikey bar dardır, genişliği sabittir ve kenarını sistem arayüzüyle paylaşır. Bu rehber bar'ların ne zaman dikey olduğunu, öğelerinizi nasıl hazırlayacağınızı, taşmayı ve sıralamayı nasıl kontrol edeceğinizi ve ne zaman devre dışı bırakacağınızı anlatıyor. Apple'ın Raise the bar with iPhone Duo Tech Talk'una, Apple'ın dokümantasyonuna ve iOS geliştiricisi @sarunw'nun paylaşımlarına dayanıyor. Bu API'ler iOS 27.0 ve 27.1 ile geldi; ayrıntılar sürümler arasında değişebilir.
iPhone Duo'daki dikey bar nedir?
Dikey bar, eskiden ekranın üstü ile altı arasında bölünen her şeyi bir arada tutan, bir yan kenar boyunca uzanan tek bir şerittir. @sarunw'nun ifadesiyle Live Activities'i, durum bilgilerini, navigation ve toolbar öğelerini bir araya getirir; bunların hepsi "tek bir kenar boyunca alanı paylaşır."
Apple bunu, navigation, toolbar ve tab bar kontrollerinin 90 derece döndürülerek dikey bir yığına dönüştürülmüş tek bir bölgeyi paylaşması olarak tanımlıyor. Status bar da buna uyacak şekilde eksen değiştiriyor; Blake Crosley'nin Apple'ın tasarım sunumuna dair notları, Live Activities geldikçe Dynamic Island'ın dikey olarak genişlediğini anlatıyor. Apple'ın dokümantasyonuna göre bar göründüğünde veya kaybolduğunda içerik yeniden akar ve bar için leading veya trailing bir safe area inset'i eklenir ya da kaldırılır. Bu cihazda yatay safe area inset'leri ve content margin'lerin bu kadar önemli olmasının nedeni bu.
Bu davranışa en yeni SDK ile derleyerek dahil olursunuz. Apple'ın Prepare your app for iPhone Duo sunumuna göre iOS 27.1 SDK ile standart navigation ve toolbar düğmeleri status bar'ın altında dikey olarak yerleşir.
iPhone Duo'da toolbar ne zaman dikey olur?
Dikey bar görüp görmeyeceğiniz ekrana, ekran yönüne ve container'ınızın nerede durduğuna bağlıdır.
| Bağlam | Bar'lar |
|---|---|
| Dış ekran (kapalı) | Dikey, yan kenar boyunca |
| İç ekran, yatay | Dikey, yan kenar boyunca |
| İç ekran, dikey | Yatay, üstte ve altta |
| Split view: detay sütunu | Bağlam izin verdiğinde dikey |
| Split view: diğer sütunlar | Yatay |
| Genişletilmiş inspector | Kendi bar'ı yok; detay sütununda zaten var |
| Dış ekrandaki sheet | Mevcut bir toolbar dikey görünür |
| İç ekranda ortalanmış sheet | Yatay |
| Klavye aksesuar bar'ı | Klavyeye bağlı kalır |
Split view satırlarının arkasındaki kural basit: bir bar yalnızca container'ı ekran kenarı boyunca uzanıyorsa dikey olur. @sarunw'nun belirttiği gibi split view'un detay sütunu dikey bar alır, diğer sütunlar yatay kalır. Apple'ın Tech Talk'u, preferredPlacement ile konumlandırılan sheet'lerin sağ tarafta dikey bar aldığını, sol tarafta ise almadığını ekliyor. İç ekran dikeyde ve yatayda aynı size class'ları bildirdiğinden, bar cihazı döndürdüğünüzde değişen birkaç şeyden biri. Geri kalanını iPhone Duo size class'ları rehberimiz anlatıyor.
Hangi container'lar sayılıyor? SwiftUI'da Apple, toolbar modifier'ını NavigationStack veya NavigationSplitView ile birlikte kullanıyor. UIKit'te kendi bar'larını yöneten UINavigationController ve UITabBarController'ı tercih edin.
NavigationStack {
ContentView()
.toolbar {
ToolbarItem(placement: .bottomBar) {
Button("Share", systemImage: "square.and.arrow.up") { share() }
}
}
}
Bu örnekte iPhone Duo'ya özgü hiçbir şey yok. iOS 27.1 SDK ile derlendiğinde alt bar öğesi, bağlam izin verdiği yerde dikey bar'a taşınır.
Dikey bar neden başlıklar yerine sembolleri öne çıkarır?
Yatay bir bar'ın yüksekliği sabittir ve etiketlerinin gerektirdiği kadar genişleyebilir. Dikey bar bunu tersine çevirir: Apple sabit bir genişlik ve esnek öğe yüksekliği tanımlıyor. Uzun bir başlığın gidecek yeri yoktur; bu yüzden bar yalnızca sembol içeren öğeleri öne çıkarır.
Her yerleşim için ayrı bir gösterim seçmezsiniz. Her öğeye bir ikon ve bir başlık verirsiniz, seçimi sistem yapar. Apple'ın Tech Talk'una göre ikonu olan öğeler dikey olur, yalnızca metin içeren öğeler yatay kalır; taşma menüleri ise hem başlığı hem ikonu gösterir. @sarunw'nun kısayolunun işe yaramasının nedeni bu: "Toolbar öğelerine hem ikon hem başlık verin, büyük ihtimalle iPhone Duo'ya hazırsınız." Yalnızca sembol gösterilen bir öğe için bile başlığı her zaman sağlayın; sistem onu taşma menülerinde ve genişletilmiş biçimlerde kullanır.
Özel view'lar daha fazla özen ister. @sarunw, ikon ve başlık gösteren özel bir panelin yatayda çalıştığını, ancak dikey bar'da başlıkların gizlenmesi gerektiğini, aksi takdirde panelin sabit genişliğe sıkıştırılacağını belirtiyor. Apple'ın toolbarVerticalEdge environment değeri, özel bir view'a bu bağlamda olduğunu söyler:
struct FilterPanel: View {
@Environment(\.toolbarVerticalEdge) private var toolbarVerticalEdge
var body: some View {
if toolbarVerticalEdge == nil {
Label("Filters", systemImage: "line.3.horizontal.decrease")
} else {
Image(systemName: "line.3.horizontal.decrease")
.accessibilityLabel("Filters")
}
}
}
Değer bir HorizontalEdge? ve iOS 27.1 ile geldi. Apple bunu, "şu anda bir dikey bar görünür olsun ya da olmasın" sistemin dikey bar için tercih ettiği kenar olarak, hiç dikey bar kullanılmayan yerlerde ise nil olarak belgeliyor. UIKit'te, bu bağlamlarda belirtilmemiş (unspecified) bir değer döndüren traitCollection.verticalBarEdge'i okuyun.
Bazı öğeler asla dikey olmamalıdır. Fiyat gösteren bir sepet düğmesi bilgiyi metninde taşır. Apple'ın Tech Talk'u bu tür öğeler için ekranda .horizontalOnly ve .verticalPreferred değerleri adlandırılan bir axisBehavior modifier'ı gösteriyor.
visibilityPriority ile taşma nasıl kontrol edilir?
Dikey bar'ın yeri yatay bir bar'a göre daha çabuk dolar; özellikle dış ekran yataydayken veya klavye ya da Picture in Picture alan için yarıştığında. Bu olduğunda öğeler bir taşma menüsüne taşınır. Apple'a göre varsayılan olarak öğeler aşağıdan yukarıya doğru taşar.
Önemli bir öğeyi görünür tutmak için önceliğini, Apple'ın iOS 27.0 için belgelediği .visibilityPriority ile yükseltin. Düşük öncelikli öğeler taşma menüsüne önce gider.
.toolbar {
ToolbarItem(placement: .bottomBar) {
Button("Archive", systemImage: "archivebox") { archive() }
}
ToolbarItem(placement: .bottomBar) {
Button("Compose", systemImage: "square.and.pencil") { compose() }
}
.visibilityPriority(.high)
}
Bu örnekte Archive, Compose'dan önce taşma menüsüne gider. Tech Talk'a göre UIKit aynı fikri item.visibilityPriority = .high ile kullanıyor. Apple önce gruplara, ardından grupların içindeki öğelere öncelik atamayı öneriyor. Ayrıca Compose gibi sık kullanılan eylemlerin ve rozetli veya durum gösteren öğelerin en uzun süre görünür kalmasını öneriyor.
Kendi "daha fazla" menünüz varsa onu sistemin menüsüne katın. Apple SwiftUI'da ToolbarOverflowMenu'yü, UIKit'te navigationItem.additionalOverflowItems'ı gösteriyor ve üç nokta sembolünü taşma için ayırmanızı istiyor. Bir tab bar ile bir toolbar yarıştığında, hangisinin önce sıkışacağına SwiftUI'da toolbarVerticalCompressionBehavior(_:), UIKit'te verticalBarCompressionBehavior karar verir. Varsayılan olarak toolbar sıkışır.
topBarPinnedTrailing ile Done nasıl sabitlenir ve öğeler nasıl sıralanır?
Dikey bar'da sıralama önemlidir, çünkü en kolay bulunan yer en üsttür. Apple'ın önerisi, en üstü Back veya Close gibi birincil navigasyon için ayırmak, ardından Done gibi öne çıkan eylemleri koymaktır. Navigation controller'lar Back'i otomatik olarak ekler. SwiftUI'da özel bir Close düğmesi için Apple ToolbarItem(placement: .cancellationAction) kullanıyor.
Öne çıkan eylem için .topBarPinnedTrailing kullanın. Apple bunu iOS 27.0'dan itibaren kullanılabilir olarak belgeliyor; @sarunw da öğeyi dikey bar'ın üst kısmına yakın tuttuğunu belirtiyor.
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("Cancel", systemImage: "xmark") { dismiss() }
}
ToolbarItem(placement: .topBarPinnedTrailing) {
Button("Done", systemImage: "checkmark") { save() }
}
}
Sabitlenen öğeler yerinde kalır: Apple'ın dokümantasyonuna göre bunlar "yalnızca arama etkinken ve yeterli yer olmadığında taşma menüsüne geçer." Tech Talk'taki UIKit karşılığı, bir UIBarButtonItemGroup'a ayarlanan navigationItem.pinnedTrailingGroup.
iPhone Duo'da dikey bar nasıl devre dışı bırakılır?
Her uygulamanın dikey bar'a ihtiyacı yok. Apple'ın örneği Calculator: yatay alanın değerli olduğu, tek sayfalık, ağırlığı alt kısımda olan bir yerleşim. Dokümantasyonu ayrıca toolbar kontrolleri olan tam ekran bir video oynatıcıyı da sayıyor. Bunlar için iOS 27.1 ile gelen SwiftUI'ın toolbarVerticalBehavior(_:)'ı, standart yatay üst ve alt bar'lara geri döner.
NavigationStack {
CalculatorView()
.toolbarVerticalBehavior(.disabled)
}
final class CalculatorViewController: UIViewController {
override var preferredVerticalBarBehavior: UIVerticalBarBehavior {
.disabled
}
}
İlk örnek SwiftUI, ikincisi UIKit. İkisi de Apple'ın Tech Talk'undan ve dokümantasyonundan; ikisinin de varsayılanı automatic. SwiftUI'da davranış container tarafından çözümlenir: NavigationStack en üstteki view'unu, TabView seçili sekmeyi, NavigationSplitView ise en sondaki (trailing) sütunu kullanır.
Apple bunu kalıcı bir tercih olarak ele almanızı istiyor. Kullanıcılar gezinirken veya tek bir view'un durumu değiştikçe açıp kapatmayın. Bar'ları yalnızca tek bir ekranda gizlemek istiyorsanız bunun yerine toolbarVisibility(_:for:) kullanın. Ayrıca Apple'ın forumlarındaki bir geliştirici raporuna göre .disabled olmasına rağmen tam ekran bir kapatma sırasında bir öğe kısa süreliğine dikey bar'da göründü; bu yüzden geçişleri test edin.
Özel toolbar'lar ve RTL yerleşimleri bar'ı neden taşımaz?
İki davranış geliştiricileri şaşırtıyor. Birincisi, özel bar'lar yerinde kalır. @sarunw, kendi UIToolbar, UINavigationBar veya UITabBar'ınızı oluşturursanız iPhone Duo'nun bu öğeleri taşımayacağını belirtiyor: "Sistem yalnızca kendi sahip olduğu bar'ları taşır." Apple'ın Tech Talk'u da aynısını söylüyor ve sistem tarafından yönetilen container'ları öneriyor. Özel bir bar'ı korursanız, onu verticalBarEdge veya toolbarVerticalEdge ile safe area inset'lerini kullanarak kendiniz konumlandırın.
İkincisi, sağdan sola diller bar'ı ters çevirmez. Dikey bar okuma yönünü değil donanımı takip eder ve RTL'de cihazın aynı tarafında kalır; içeriğiniz onun etrafında uyum sağlar. Özel arayüzü yalnızca yerleşim yönüne göre aynalamayın. Sistemin bildirdiği kenarı okuyun.
Apple'ın sunumundan birkaç küçük ayrıntı: dikey bar'larda varsayılan olarak scroll-edge efekti yoktur, Reduce Transparency açıkken bir arka plan kazanırlar ve esnek boşluklar dikey eksende sıfıra iner. İki yön için de ekstra boşluk eklemeyin.
Önemli çıkarımlar
- iOS 27.1 SDK ile yeniden derleyin; sistem bar'ları dış ekranda ve iç ekran yataydayken dikey olur. İç ekran dikeydeyken yatay kalır.
- Yalnızca ekran kenarı boyunca uzanan bar'lar dikey olur: split view'un detay sütunu dikey bar alır, diğer sütunlar almaz.
- Bar'ın sabit genişliği sembolleri öne çıkardığından her öğeye bir ikon ve bir başlık verin.
- Taşmadan sağ çıkması gereken eylemler için
.visibilityPriority(.high), Done için.topBarPinnedTrailingkullanın. .toolbarVerticalBehavior(.disabled)veyapreferredVerticalBarBehaviorile yalnızca hesap makinesi veya video oynatıcı gibi yerleşimlerde devre dışı bırakın.- Özel
UIToolbarveUINavigationBarörnekleri taşınmaz ve bar RTL'yi yok sayar; bunun yerinetoolbarVerticalEdgeveyaverticalBarEdgedeğerini okuyun.
Bar'larınız düzene girdikten sonra iPhone Duo safe area'ları ve content margin'leri rehberimizle içeriği yeni kenara hizalayın, ardından iPhone Duo hazırlık kontrol listesinin tamamını uygulayın. Cihazdan en iyi şekilde yararlanan uygulamalar için Built for the fold sayfasına göz atın.
Sık sorulan sorular
iPhone Duo'da bir bar ne zaman dikey olur?
Sistem bar'ları dış ekranda ve iç ekran yataydayken dikey olur; iç ekran dikeydeyken yatay kalır. Bir bar yalnızca container'ı ekran kenarı boyunca uzanıyorsa dikey olur; bu yüzden bir split view'da dikey bar'ı yalnızca detay sütunu alır.
iPhone Duo'da dikey bar'ı nasıl devre dışı bırakırım?
SwiftUI'da iOS 27.1'den itibaren kullanılabilen .toolbarVerticalBehavior(.disabled) uygulayın. UIKit'te view controller'ınızda preferredVerticalBarBehavior'ı override edip .disabled döndürün. Apple bunu yalnızca hesap makinesi veya tam ekran video oynatıcı gibi yatay bar'ların daha iyi hizmet ettiği yerleşimler için öneriyor.
Özel UIToolbar'ım neden dikey bar'a taşınmıyor?
Sistem yalnızca kendi sahip olduğu bar'ları taşır. Kendi UIToolbar, UINavigationBar veya UITabBar örneklerinizdeki öğeler dikkate alınmaz; kendi bar'larını yöneten UINavigationController ve UITabBarController'ı kullanın.
Dikey bar'ın hangi tarafta olduğunu nasıl öğrenirim?
SwiftUI'da HorizontalEdge veya nil olan toolbarVerticalEdge environment değerini, UIKit'te ise verticalBarEdge trait'ini okuyun. İkisi de bar gizliyken bile sistemin tercih ettiği kenarı yansıtır.
Sağdan sola yazılan dillerde dikey bar taraf değiştirir mi?
Hayır. Dikey bar okuma yönünü değil donanımı takip eder; bu yüzden sağdan sola dillerde de cihazın aynı tarafında kalır ve içeriğiniz onun etrafında uyum sağlar.
Kaynaklar
- Raise the bar with iPhone Duo · Apple Developer
- toolbarVerticalBehavior(_:) · Apple Developer Documentation
- toolbarVerticalEdge · Apple Developer Documentation
- verticalBarEdge · Apple Developer Documentation
- preferredVerticalBarBehavior · Apple Developer Documentation
- visibilityPriority(_:) · Apple Developer Documentation
- topBarPinnedTrailing · Apple Developer Documentation
- Prepare your app for iPhone Duo · Apple Developer
- The vertical bar brings together Live Activities, status, navigation and toolbar items · @sarunw on X
- A bar only goes vertical when its container sits along the display edge · @sarunw on X
- Opt out with .toolbarVerticalBehavior(.disabled) · @sarunw on X
- A vertical bar's width is fixed, so it favors symbol-only items · @sarunw on X
- Custom panels with icon and title get squeezed on a vertical bar · @sarunw on X
- The system only moves bars it owns · @sarunw on X
- Assign .visibilityPriority to survive an overflow · @sarunw on X
- Pin prominent actions like Done with .topBarPinnedTrailing · @sarunw on X
- Give toolbar items both icon and title · @sarunw on X
- Read .toolbarVerticalEdge in SwiftUI, or the trait in UIKit · @sarunw on X
- The vertical bar follows the hardware, not the reading direction · @sarunw on X
- iPhone Duo: navigation bar item briefly moves to vertical bar during fullScreen dismissal despite .disabled · Apple Developer Forums
- What can the APIs added in iOS 27.1 for iPhone Duo do? · DevelopersIO (Classmethod)
- Designing for iPhone Duo: What Moves, Splits, and Stays · Blake Crosley
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.