Geliştiriciler
iPhone Duo'da Sheet Sunumu: Konumlandırma ve Köşeler
iPhone Duo'da sheet sunumu nasıl çalışır: leading, trailing veya ortada sheet için presentationPlacement ve uyumlu köşeler için concentricCornerRadii.
AppleDuo EditörlüğüYayınlanma 7 dk okuma
Bu sayfada
- iPhone Duo'da sheet'ler varsayılan olarak nerede görünür?
- SwiftUI'da presentationPlacement nasıl kullanılır?
- Hangi sheet konumunu seçmeliyim?
- iPhone Duo'da sheet neden köşelerin etrafında kıvrılıyor?
- concentricCornerRadii ile ekran köşelerine nasıl uyum sağlanır?
- UnevenRoundedRectangle ne zaman kullanılmalı?
- iPhone Duo'da sheet'lerle ilgili yaygın hatalar nelerdir?
- Önemli çıkarımlar
Normal bir iPhone'da sheet alttan yukarı kayar ve tüm genişliği kaplar. iPhone Duo'da sheet sunumu farklı işler: büyük iç ekranda bir sheet ortada yüzebilir ya da leading veya trailing kenara yaslanabilir ve dış hatları ekranın düzensiz köşelerini takip edecek şekilde kıvrılır. Bu rehber, sheet'in nereye gideceğini kontrol eden iOS 27 API'lerini, sistemin her duruşta sheet'i nasıl ele aldığını ve kendi yuvarlatılmış şekillerinizi donanımla nasıl hizalayacağınızı anlatıyor.
Buradaki her şey Apple'ın dokümantasyonundan, iPhone Duo Tech Talk'larından, Apple mühendislerinin geliştirici forumlarındaki yanıtlarından ve iOS geliştiricisi @sarunw'nun paylaşımlarından derlendi. AppleDuo ekibi bu kodu donanım üzerinde çalıştırmadı. API'ler iOS 27 ve Xcode 27 ile yayımlandı; ayrıntılar sürümler arasında değişebilir.
iPhone Duo'da sheet'ler varsayılan olarak nerede görünür?
Sheet'ler her duruşa kendiliğinden uyum sağlar. Prepare your app for iPhone Duo Tech Talk'unda Apple, dış ekrandaki sheet'lerin bar düğmelerini dikey yerleştirebildiğini, iç ekrandaki sheet'lerin ise ortalandığını söylüyor. Popover'lar, context menu'ler ve alert'ler de uyum sağlıyor.
Bir Apple DTS mühendisi bir geliştirici forumu başlığında daha fazla ayrıntı verdi: cihaz katlıyken tüm sheet'ler leading kenara kayıyor, iç ekran tamamen düz açıldığında ise ortada sunuluyor.
Sheet içindeki bar'lar kendi kurallarına uyar. Apple'ın Preparing your app for iPhone Duo makalesine göre dış ekran, sheet'in bar'larını varsayılan olarak dikey sunar. İç ekranda toolbar, ortalanmış veya leading sheet'lerde yatay, trailing sheet'lerde dikeydir.
| Nerede | Varsayılan sheet konumu | Sheet içindeki bar'lar |
|---|---|---|
| Dış ekran (kapalı) | Otomatik uyum sağlar | Varsayılan olarak dikey |
| İç ekran, kısmen katlı | Leading kenar (Apple DTS'e göre) | Leading konumda yatay |
| İç ekran, tamamen düz | Orta | Ortalanmış konumda yatay |
| İç ekran, trailing konum | Trailing kenar (siz istediğinizde) | Dikey |
Sheet'te dikey bar istemiyorsanız SwiftUI'da toolbarVerticalBehavior(_:), UIKit'te preferredVerticalBarBehavior ile devre dışı bırakın. iPhone Duo dikey toolbar rehberimiz bu bar'ların nasıl oluşturulduğunu ve öğelerin nasıl taştığını anlatıyor.
SwiftUI'da presentationPlacement nasıl kullanılır?
iOS 27, presentationPlacement(_:) modifier'ını ve PresentationPlacement tipini ekliyor. Bunu presentationDetents gibi modifier'ların yanında, sheet'in içeriğine uygularsınız. Aşağıdaki, Apple'ın dokümantasyonundaki örnek; sheet'in arkasında haritanın daha büyük bir kısmını görünür bırakıyor:
Map()
.sheet(isPresented: $isPresented) {
PlaceDetailView()
.presentationDetents([.medium, .large])
.presentationPlacement(.leading)
}
PresentationPlacement dört statik değere sahip. Apple, bunları yalnızca sheet sunumlarının dikkate aldığını belirtiyor; popover'lar, alert'ler ve menüler bu modifier'ı yok sayar.
| Değer | Apple'ın dokümantasyonu ne diyor |
|---|---|
.automatic | Konumu sistem belirler (varsayılan) |
.center | Sunumu, sunan view'un içinde ortalar |
.leading | Sunumu, sunan view'un leading kenarına yerleştirir |
.trailing | Sunumu, sunan view'un trailing kenarına yerleştirir |
Leading ve trailing, yerleşim yönüne bağlı terimlerdir; bu yüzden sağdan sola yazılan bir dilde .leading sheet'i sağa koymalıdır. Bu, @sarunw'nun belirttiği gibi okuma yönünü değil donanımı takip eden dikey bar'dan farklıdır. Uygulamanız Arapça veya İbraniceye yerelleştirildiyse iki yönü de test edin.
UIKit'te durum nedir?
UIKit'te, sunulan view controller'ın UISheetPresentationController nesnesindeki preferredPlacement özelliğini ayarlayın. Apple'ın makalesi bunu presentationPlacement(_:)'ın UIKit karşılığı olarak gösteriyor; bir Apple Technology Evangelist de bu forum başlığında sheet'lerin, kişinin iPhone Duo'yu tutuş şekline nasıl uyum sağlayacağını etkilemenin yolu olarak bu özelliği işaret etti. Kodu yazmadan önce tam değer adları için Xcode 27'deki UIKit header'larına bakın.
Hangi sheet konumunu seçmeliyim?
.automatic ile başlayın. Sistem, cihaz katlandıkça sheet'leri zaten orta ile leading kenar arasında taşıyor ve her durum için doğru bar yönünü seçiyor. Konumu yalnızca bir nedeniniz olduğunda değiştirin.
Bir taraf seçmek için iyi nedenler:
- Ana içeriği görünür tutmak. Apple'ın kendi örneği, harita üzerindeki bir mekân kartı için
.leadingkullanıyor. Aynı fikri bir fotoğrafın, belgenin veya oyun tahtasının yanındaki inspector tarzı bir sheet için de kullanın. - Sheet'i dikey bar'dan uzak tutmak. İç ekran bazı duruşlarda bar'ları tek bir kenar boyunca yerleştirir. Ana view'unuz o kenarı zaten kullanıyorsa, sheet'i diğer tarafa koymak toolbar'ı açıkta bırakır. Trailing bir sheet'in kendi dikey toolbar'ını aldığını unutmayın.
- Sheet'in düzenlediği içeriğin yanında kalmak. Değiştirdiği paragrafın yanında duran bir biçimlendirme sheet'ini kullanmak, paragrafı örten bir sheet'ten daha kolaydır.
Giriş yapma, paylaşım akışı veya ayarlar formu gibi, sheet'in arkasındaki hiçbir şeyin önemli olmadığı odaklı ve kendi içinde tamamlanan görevler için .center seçin.
Konum duruşa göre değişebilir mi?
Kendiliğinden değişmez. Bir Apple mühendisi forumlarda doğruladı: belirlediğiniz konum yalnızca katlıyken değil, her zaman geçerli ve "önce orta, sonra trailing" gibi bir yedek sıralama yok. Önerilen geçici çözüm, etkin bir division reserved region'ı algılayıp konumu kendiniz seçmek:
struct PlaceMapView: View {
@State private var isPresented = true
var body: some View {
GeometryReader { proxy in
// Etkin division = katlanma kullanımda (kısmen katlı)
let isFolded = !proxy.reservedRegions(kind: .division).isEmpty
Map()
.sheet(isPresented: $isPresented) {
PlaceDetailView()
.presentationDetents([.medium, .large])
.presentationPlacement(isFolded ? .trailing : .automatic)
}
}
}
}
Bu, Apple'ın yayımladığı bir kod değil; belgelenmiş iki API'den, reservedRegions(kind:) ve presentationPlacement(_:)'dan kurulmuş bir taslak. Reserved region'lar ve katlanma yeri rehberimiz etkin ve etkin olmayan bölgeleri daha ayrıntılı açıklıyor; hinge durumları ve onHingeChange ise duruş değişikliklerini doğrudan dinlemeyi anlatıyor.
iPhone Duo'da sheet neden köşelerin etrafında kıvrılıyor?
@sarunw'nun belirttiği gibi, iPhone Duo'daki bir sheet cihazın düzensiz köşelerinin etrafında kıvrılır. Sistem sheet'leri, popover'lar ve diğer container'lar eş merkezli köşeler kullanır: her iç kavis, dışındaki kavisle aynı merkez noktasını paylaşır; böylece ikisi arasındaki boşluk her yerde eşit kalır.
Apple, Tech Talk'ta iOS 26'da gelen Concentricity API'lerinin iPhone Duo'daki ekran şekilleriyle çalışacak şekilde güncellendiğini söylüyor. SwiftUI'da bu ConcentricRectangle, UIKit'te UICornerConfiguration demek. Tech Talk'un SwiftUI örneği tek bir dolgulu şekilden oluşuyor:
ConcentricRectangle()
.fill(Color.green)
.padding(8.0)
.ignoresSafeArea()
Sistem sheet'lerini ve bu şekilleri kullanırsanız uyumlu köşeleri hiçbir ek çaba olmadan elde edersiniz. Sorun, başka bir iPhone için ayarlanmış sabit bir cornerRadius ile kendi panellerinizi çizdiğinizde ortaya çıkar.
concentricCornerRadii ile ekran köşelerine nasıl uyum sağlanır?
iOS 27, GeometryProxy'ye concentricCornerRadii özelliğini ekliyor. ConcentricRectangle'dan farklı olarak hiçbir şey çizmez; özel çizimler, animasyonlar veya kendi şekilleriniz için kullanabileceğiniz bir RectangleCornerRadii? döndürür. Eşlik eden concentricCornerRadii(in:) metodu aynı işi view'un bir alt dikdörtgeni için yapar.
Apple'ın dokümantasyonu kuralı şöyle veriyor: her köşenin yarıçapı, container'ın köşe yarıçapından view'un köşesinin container'ın köşesine olan uzaklığı çıkarılarak bulunur. Container'ın köşelerinden uzak köşeler sıfır alır ve sonuç, view'un sahip olabileceği en büyük yarıçapla sınırlandırılır.
@sarunw hesaplanmış bir örnek veriyor: iPhone 18 Pro'da ekran köşesi 62 point olduğundan, 16 point uzaktaki bir view 62 − 16 = 46 point alır. 62 point değeri onun paylaşımından geliyor; incelediğimiz sayfalarda Apple cihaz bazında köşe yarıçaplarını yayımlamıyor.
| Ekran köşesi | Köşeden uzaklık | Eş merkezli yarıçap |
|---|---|---|
| 62 pt (iPhone 18 Pro, @sarunw'ya göre) | 16 pt | 46 pt |
| 62 pt | 8 pt | 54 pt |
| 62 pt | 62 pt veya daha fazla | 0 pt |
Son iki satır, belgelenmiş formülü aynı köşeye uyguluyor; ayrı ölçümler değiller. iPhone Duo'da köşeler tek tip değil; değeri sabit kodlamak yerine okumanın daha iyi olmasının nedeni de tam olarak bu.
Container şekli ayarlanmamışsa veya şekil yeterli köşe bilgisi sağlamıyorsa özellik nil döndürür. Apple'ın örneği bunu containerShape(_:) ile açıkça ayarlıyor. nil durumunu her zaman makul bir yedek değerle ele alın:
struct FloatingPanel: View {
private let fallback = RectangleCornerRadii(
topLeading: 16, bottomLeading: 16,
bottomTrailing: 16, topTrailing: 16
)
var body: some View {
GeometryReader { proxy in
UnevenRoundedRectangle(
cornerRadii: proxy.concentricCornerRadii ?? fallback,
style: .continuous
)
.fill(.thinMaterial)
}
.padding(16)
.ignoresSafeArea()
}
}
Panel kenarlardan 16 point içeride durur, proxy'den eş merkezli yarıçaplarını ister ve bunları UnevenRoundedRectangle ile çizer. Sistem bir container şekli çözemezse panel eşit 16 point'lik bir yarıçapa geri döner.
UnevenRoundedRectangle ne zaman kullanılmalı?
UnevenRoundedRectangle her köşesinde farklı yarıçap olan bir dikdörtgen çizer. iOS 27'de yeni değil (Apple'ın dokümantasyonu iOS 16'dan itibaren listeliyor), ancak concentricCornerRadii'nin doğal ortağı; çünkü bir ekran köşesine yakın duran bir view o köşede büyük, diğer her yerde küçük bir yarıçap ister.
Yukarıdaki gibi bir RectangleCornerRadii değeri verebilir ya da her köşeyi ayrı ayrı belirtebilirsiniz:
UnevenRoundedRectangle(
topLeadingRadius: 46,
bottomLeadingRadius: 46,
bottomTrailingRadius: 12,
topTrailingRadius: 12,
style: .continuous
)
.fill(.background.secondary)
Bu şekil, leading kenara sabitlenmiş özel bir panele uygundur: dıştaki iki köşe ekranı takip eder, içteki iki köşe sıkı kalır. Yalnızca tek bir cihaz ve tek bir uzaklık için geçerli olan 46 gibi sabit sayılar yerine concentricCornerRadii'den hesaplanan değerleri tercih edin.
| İhtiyaç | Kullanın | İtibaren |
|---|---|---|
| Container'ına uyan, sistemin çizdiği bir şekil | ConcentricRectangle | iOS 26 |
| Özel çizim için yalnızca yarıçaplar | GeometryProxy.concentricCornerRadii | iOS 27 |
| Her köşede kendi belirlediğiniz yarıçap | UnevenRoundedRectangle | iOS 16 (Apple'ın dokümantasyonuna göre) |
iPhone Duo'da sheet'lerle ilgili yaygın hatalar nelerdir?
- Konumu her yerde değiştirmek. Sabit bir konum her duruşta geçerli olduğundan, yarı katlıyken doğru görünen bir sheet tamamen düz açıkken tuhaf görünebilir. Bir ekran aksini gerektirmedikçe
.automatickullanın. - Özel presentation controller'lar. Elle yazılmış bir sunum, sistemin duruş uyarlamasını veya eş merkezli köşelerini almaz. Detent'li sistem sheet'lerini tercih edin.
- Sabit kodlanmış köşe yarıçapları. Eski bir iPhone'dan kopyalanan yarıçap, iPhone Duo'nun köşelerine uymaz.
concentricCornerRadii'yi okuyun veyaConcentricRectanglekullanın. - Sheet içindeki eşit olmayan kenar boşlukları. Dikey bir bar'ın yanında kenar boşlukları tarafa göre farklılaşır. Safe area'lar ve content margin'ler yazımız
contentMargins(for:edges:)'i anlatıyor. - Beta araç zincirleri. Bir geliştirici, Xcode 27 beta 6 kullanılan bir cihazda, availability kontrolünün arkasında olmasına rağmen
PresentationPlacement.leadingiçin "Symbol not found" hatasıyla açılışta çökme bildirdi. O başlıkta doğrulanmış bir neden yok; bunu kendi hatanız gibi ayıklamadan önce yayım sürümü Xcode 27 ve buna uygun bir işletim sistemiyle derleyin.
Her sheet'i her duruşta kontrol edin: kapalı, kısmen katlı ve tamamen düz açık; her iki yönde de. iPhone Duo hazırlık kontrol listemiz yapmaya değer diğer kontrolleri sıralıyor.
Önemli çıkarımlar
- iPhone Duo'da sheet'ler varsayılan olarak uyum sağlar: açık iç ekranda ortalanır, katlıyken leading kenara kayar ve dış ekranda dikey bar'lar kullanır.
- İkisi de iOS 27 ile gelen
presentationPlacement(_:)(SwiftUI) vepreferredPlacement(UIKit), sheet'i leading, trailing veya ortaya yerleştirir. Bunu yalnızca sheet'ler dikkate alır ve her duruşta geçerlidir. - Konumu duruşa göre değiştirmek için
reservedRegions(kind:)ile etkin bir division olup olmadığını kontrol edin ve değeri kendiniz seçin. GeometryProxyüzerindekiconcentricCornerRadii(iOS 27), container'ın köşeleriyle aynı merkezi paylaşan yarıçapları döndürür;nildurumunu ele alın.- Bu yarıçapları
UnevenRoundedRectangleile çizin ya da yalnızca şekle ihtiyacınız varsaConcentricRectanglekullanın.
Sırada, bar'ların dikey kenara nasıl taşındığını okuyun; ardından katlanabilir ekran için geliştirilmiş oyunlar koleksiyonumuzda geliştiricilerin neler yaptığına göz atın.
Sık sorulan sorular
iPhone Duo'da bir sheet'i leading veya trailing tarafa nasıl yerleştiririm?
SwiftUI'da sheet'in içeriğine presentationPlacement(.leading) veya presentationPlacement(.trailing) uygulayın. UIKit'te view controller'ın UISheetPresentationController nesnesindeki preferredPlacement özelliğini ayarlayın. Konumu yalnızca sheet sunumları dikkate alır.
iPhone Duo'da sheet varsayılan olarak nerede görünür?
Otomatik konumda kararı sistem verir. Apple'a göre sheet'ler iç ekranda ortalanır; bir Apple mühendisi de geliştirici forumlarında, cihaz katlıyken sheet'lerin leading kenara kaydığını, iç ekran tamamen düz açıldığında ise ortada sunulduğunu söyledi.
Cihaz katlandığında presentationPlacement değişir mi?
Hayır. Geliştirici forumlarındaki bir Apple mühendisine göre belirlediğiniz konum yalnızca katlıyken değil, her zaman geçerlidir. Konumu duruşa göre değiştirmek için etkin bir division reserved region olup olmadığını kontrol edip konumu kendiniz seçin.
concentricCornerRadii ne döndürür?
Bir view'un köşelerinin container'ın köşeleriyle aynı merkezi paylaşması için gereken köşe yarıçaplarını RectangleCornerRadii değeri olarak döndürür. Container şekli ayarlanmamışsa veya şekil yeterli köşe bilgisi sağlamıyorsa nil döner. iOS 27 ile geldi.
UnevenRoundedRectangle ile ConcentricRectangle arasındaki fark nedir?
UnevenRoundedRectangle, her köşe için sizin verdiğiniz yarıçaplarla bir dikdörtgen çizer. iOS 26'da gelen ConcentricRectangle eş merkezli köşeleri sizin için hesaplar ve şekli çizer. concentricCornerRadii ikisinin arasında yer alır: yalnızca yarıçapları döndürür, böylece onları UnevenRoundedRectangle'a veya bir Path'e verebilirsiniz.
Kaynaklar
- presentationPlacement(_:) · Apple Developer Documentation
- PresentationPlacement · Apple Developer Documentation
- Preparing your app for iPhone Duo · Apple Developer Documentation
- Prepare your app for iPhone Duo (Tech Talk) · Apple Developer
- concentricCornerRadii · Apple Developer Documentation
- UnevenRoundedRectangle · Apple Developer Documentation
- Modal on trailing (DTS answer on sheet placement) · Apple Developer Forums
- Controlling sheet presentation across iPhone Duo poses · Apple Developer Forums
- A sheet can sit on the leading side, the trailing side, or the center · @sarunw on X
- The sheet on iPhone Duo curves around the device's uneven corners · @sarunw on X
- iOS 27 adds concentricCornerRadii to GeometryProxy · @sarunw on X
- 62 − 16 = 46: how a concentric corner is calculated · @sarunw on X
- Need a different radius on each corner? Use UnevenRoundedRectangle · @sarunw on X
- The vertical bar follows the hardware, not the reading direction · @sarunw on X
- .presentationPlacement(.leading) does not work! · Apple Developer Forums
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.