Geliştiriciler
iPhone Duo Menteşe Durumu: onHingeChange ve UIHingeInteraction
iOS 27.1'de onHingeChange veya UIHingeInteraction ile iPhone Duo menteşe durumunu ve açısını okuyun, efektler ve oyun kontrolleri için kullanın, örnek oyunları görün.
AppleDuo EditörlüğüYayınlanma 5 dk okuma
Bu sayfada
iPhone Duo menteşeye sahip ilk iPhone ve iOS 27.1 uygulamanızın bu menteşeyi okumasını sağlıyor. Cihazın kapalı mı, kısmen açık mı yoksa tamamen açık mı olduğunu öğrenebilir ve biri cihazı katlarken menteşe açısını tam olarak takip edebilirsiniz. Bu rehber, SwiftUI ve UIKit'teki iPhone Duo menteşe durumu API'lerini, bunları ne zaman kullanmanız ve ne zaman kullanmamanız gerektiğini, katlama hareketini şimdiden bir kontrole dönüştüren oyunlarla birlikte anlatıyor.
Ayrıntılar Apple'ın belgelerinden, Apple'ın iPhone Duo Tech Talk'larından ve forum yanıtlarından, ayrıca iOS geliştiricisi @sarunw tarafından paylaşılan bir gönderiden geliyor. Bu API'leri donanım üzerinde test etmedik. iOS 27.1 ve Xcode 27.1 ile geldiler; bu yüzden adlar ve davranışlar sonraki sürümlerde hâlâ değişebilir.
iPhone Duo hangi menteşe durumlarını bildirir?
@sarunw'un özetlediği gibi: "3 menteşe durumu var: closed, partiallyOpen ve fullyOpen." Apple'ın Leverage multiple displays and scenes on iPhone Duo Tech Talk'u aynı "üst düzey menteşe durumunu" tarif ediyor ve API'nin ayrıca "menteşe açısının sürekli güncellemelerini" sağladığını ekliyor.
Apple'ın belgeleri, durumun "sistem tarafından mevcut açıya ve cihaz yönüne göre belirlendiğini" söylüyor. Başka bir deyişle, kararlar için basit bir durum, akıcı hareket etmesi gereken her şey için de hassas bir açı alıyorsunuz.
| Durum | SwiftUI (DeviceHinge.Status) | UIKit (UIHinge.Status) | Apple'ın açıklaması |
|---|---|---|---|
| Kapalı | .closed | .closed | Menteşe kapalı |
| Kısmen açık | .partiallyOpen | .partiallyOpen | Menteşe kısmen açık |
| Tamamen açık | .fullyOpen | .fullyOpen | Cihazın izin verdiği kadar açık |
| Bilinmiyor | listelenmemiş | .unknown | Durum bilinmiyor |
Açı türü framework'e göre değişiyor. SwiftUI'de DeviceHinge.angle bir Angle. UIKit'te UIHinge.angle radyan cinsinden bir CGFloat.
SwiftUI'de .onHingeChange nasıl kullanılır?
SwiftUI API'si iOS 27.1'de kullanılabilen onHingeChange(isEnabled:_:). Eylemi, biri önceki biri yeni olmak üzere iki DeviceHingeContext değeri alır. Her bağlamda, angle ve status sunan DeviceHinge türünde isteğe bağlı bir hinge bulunur.
Apple'ın belgelerindeki bu örnek menteşeyi state'te saklıyor ve menteşe olmadığında bir yedek görünüm gösteriyor:
@State private var hinge: DeviceHinge? = nil
var body: some View {
VStack {
if let hinge {
AngleDisplayView(angle: hinge.angle)
StatusDisplayView(status: hinge.status)
} else {
ContentUnavailableView(
"Hinge Unavailable",
systemImage: "rectangle.split.2x1")
}
}
.onHingeChange { _, newContext in
hinge = newContext.hinge
}
}
nil bir hinge, cihazda menteşe olmadığı anlamına gelir; bu durumu her zaman ele alın. isEnabled parametresinin varsayılan değeri true.
Eski ve yeni değerleri kullanmak
Closure her iki bağlamı da aldığı için cihazın kapandığı an gibi bir geçişi algılayabilirsiniz. Bu, yalnızca belgelenmiş türler üzerine kurulu kendi taslağımız:
.onHingeChange { oldContext, newContext in
let wasClosed = oldContext.hinge?.status == .closed
let isClosed = newContext.hinge?.status == .closed
if !wasClosed && isClosed {
game.closeLid()
}
}
game.closeLid() burada sizin kendi kodunuzu temsil ediyor. Eski ve yeni değerleri karşılaştırmak, yalnızca açı değiştiğinde aynı eylemin iki kez çalışmasını önler.
UIKit'te menteşeyi UIHingeInteraction ile nasıl izlerim?
UIKit'te bir görünüme UIHingeInteraction ekleyin. İşleyicisi "menteşe durumu değiştiğinde veya etkileşim hiyerarşiler arasında taşındığında" çalışır. Görünüm menteşe güncellemeleri sağlayan bir hiyerarşiden ayrıldığında güncellemenin hinge değeri nil olur. Apple'ın örneği:
override func viewDidLoad() {
super.viewDidLoad()
let interaction = UIHingeInteraction { [weak self] _, update in
guard let self else { return }
// `hinge` değerinin nil olması, etkileşimin menteşe
// güncellemeleri sağlayan bir hiyerarşiden ayrıldığını gösterir.
guard let hinge = update.hinge else {
handleHingeUnavailable()
return
}
updateAngleDisplay(with: hinge.angle)
updateStatusDisplay(with: hinge.status)
}
view.addInteraction(interaction)
}
Etkileşimin bir isEnabled özelliği de var. Menteşe bilgisini trait collection içinde aramayın. Bir Apple mühendisi geliştirici forumlarında menteşe duruşu için UITraitCollection özelliği bulunmadığını doğruladı.
Menteşe durumu düzenimi belirlemeli mi?
Hayır. En önemli kural bu. Apple'ın Tech Talk'u şöyle diyor: "Menteşe verisi canlı olarak izlenir ve etkileşimleri veya efektleri yönlendirmek için idealdir. Düzen için arrangement ve region API'lerini kullanın."
Bir Apple Technology Evangelist'i forumlarda en kolaydan en özele doğru dört yaklaşım sıraladı:
NavigationSplitViewveyaUISplitViewControllergibi bir sistem kapsayıcısı kullanın.- Bu yeterli değilse
ArrangementViewveyaUIArrangementViewControllerdeneyin. - Yalnızca ikisi de işe yaramazsa görünümleri ayrılmış bölge (reserved region) API'leriyle konumlandırın.
- Düzen kararları için
onHingeChangeveya hinge interaction API'sini kullanmayın.
Düzen için Apple'ın forumdaki yönergesi, cihaza özgü mantıktan kaçınmak ve cihaz açılıp kapandığında değişen boyut sınıflarını benimsemek. iPhone Duo boyut sınıfları, ArrangementView ve ayrılmış bölgeler ve katlama yeri rehberlerimiz bu araçları ele alıyor. Katlama yerinin bölme bölgesi yalnızca cihaz katlıyken etkin olur; yani ayrılmış bölgeler kıvrımın nerede olduğunu size zaten söylüyor.
Menteşe olayları harekete tepki vermesi gereken şeyler içindir: bir duvar kâğıdında yakınlaştırma efekti, katlamayla açılan bir kapak ya da bir oyun mekaniği. Apple'ın Tech Talk'u, kısmen katlanmış bir menteşenin whammy bar gibi çalıştığı bir gitar uygulaması geliştiriyor:
.onHingeChange { _, context in
if let hinge = context.hinge, hinge.status == .partiallyOpen {
pitchBend = calculatePitchBend(angle: hinge.angle)
}
else {
pitchBend = 0
}
}
Bükme yalnızca .partiallyOpen durumunda uygulanıyor, diğer durumlarda sıfırlanıyor. Apple calculatePitchBend fonksiyonunun gövdesini göstermiyor; açıdan efekte eşlemeyi nasıl yapacağınız size kalmış.
Masa üstü modu için nasıl tasarım yapmalıyım?
iPhone Duo bir masada "iç ekranı size dönük bir dizüstü bilgisayar gibi" durduğunda alt yarı sağlam bir taban, üst yarı ise kolayca bakılan bir yüzey olur. Apple'ın "Design for iPhone Duo" Tech Talk'u, "medyanın üstte durabileceğini, dokunulabilir kontrollerin ise alttaki sağlam tabanda yer alabileceğini" öneriyor.
Ancak bir püf noktası var. Apple, bu duruş için özel bir düzenin "diğer duruşlarla aynı kontrolleri ve genel hiyerarşiyi" koruması gerektiğini ekliyor, çünkü "işlevselliği belirli bir duruşa bağlamak istemezsiniz." Uygulamalar için bu, masa üstü modunun içeriği yeniden düzenleyebileceği, ancak her özelliğin cihaz düz veya kapalıyken de çalışması gerektiği anlamına geliyor.
Oyunlar daha özgür, çünkü eğlencenin kendisi duruş olabilir. Yine de bir yedek seçenek sunmak işe yarar. Örneğin Marbles Unhinged, App Store'da ekranda menteşesi olan herhangi bir iPhone veya iPad'de de oynanabildiğini belirtiyor.
Hangi oyunlar menteşeyi bir kontrole dönüştürüyor?
Birçok iPhone Duo oyunu katlama hareketini şimdiden bir girdi olarak kullanıyor. Aşağıdaki açıklamalar her oyunun App Store sayfasından ve basında çıkan haberlerden alındı. Her geliştiricinin dahili olarak hangi API'leri kullandığını bilmiyoruz.
| Oyun | Menteşe ne yapıyor |
|---|---|
| Marbles Unhinged | Üst yarıyı büktüğünüzde zemini bir rampaya dönüşüyor. Katlama ne kadar dikse yuvarlanma o kadar hızlı. |
| Toastie | Tost makinesinin kapağını kapatmak için telefonu katlayıp kapatın, sandviçi kontrol etmek için açın. |
| Greens: Mini-golf | Dizüstü bilgisayar gibi katlayın ve alt yarıda vuruş yapın; dik duran yarı bir caddie kamerasına dönüşüyor. |
| Battlefleet Duo | Masa üstü modunda filonuz alt ekranda, düşman suları ise karşınızda dik duruyor; iki kişi yüz yüze oynayabiliyor. |
| Duometry | MacRumors'a göre cihazı hedef bir açıya denk gelecek şekilde katlıyor ve tahmininizi kilitliyorsunuz. |
Bunlar API'lerle güzelce eşleşiyor. Toastie'nin kapağı .closed durumuna bir geçiş. Marbles Unhinged'in rampası sürekli bir açı. Greens ve Battlefleet Duo, üst yarının bir görünüm gösterdiği ve alt yarının dokunmaları aldığı masa üstü düzenleri. Duometry ham açıya ihtiyaç duyuyor.
Katlama hareketini kullanan daha fazla oyunu Built for the Fold sayfasında inceleyebilirsiniz.
Önemli çıkarımlar
- iPhone Duo üç menteşe durumu (
closed,partiallyOpenvefullyOpen) ve sürekli bir açı bildirir. UIKit'te ayrıcaunknownvar. - SwiftUI'de
.onHingeChange, UIKit'teUIHingeInteractionkullanın. İkisi de iOS 27.1 ile geldi ve menteşe yoksa ikisi denilbir hinge verir. - SwiftUI closure'ı eski ve yeni bağlamları alır; böylece her açı güncellemesi yerine geçişlere tepki verebilirsiniz.
- Düzeni boyut sınıflarına, sistem kapsayıcılarına, ArrangementView'a ve ayrılmış bölgelere bırakın. Menteşe verisini efektler, etkileşimler ve oyun mekanikleri için kullanın.
- Masa üstü tasarımları medyayı üste, kontrolleri tabana koymalı; diğer duruşlarda hiçbir özelliği gizlememeli.
Sırada, kontrolleri kıvrımdan nasıl uzak tutacağınızı ayrılmış bölgeler rehberimizde öğrenin ya da yukarıdaki oyunları Built for the Fold sayfasından oynayın.
Sık sorulan sorular
iPhone Duo'da menteşe durumları nelerdir?
Üç durum var: closed, partiallyOpen ve fullyOpen. Sistem durumu mevcut açıya ve cihazın yönüne göre belirliyor. UIKit enum'unda ayrıca bir unknown durumu da bulunuyor.
SwiftUI'de menteşe açısını nasıl okurum?
Bir görünüme .onHingeChange ekleyin. Closure önceki ve yeni menteşe bağlamını alır; yeni bağlamın hinge özelliği size bir açı ve bir durum verir. Menteşesi olmayan cihazlarda hinge nil olur.
Düzenimi değiştirmek için menteşe durumunu kullanmalı mıyım?
Hayır. Apple, onHingeChange ve hinge interaction API'sinin düzen kararları için kullanılmaması gerektiğini söylüyor. Düzen için boyut sınıflarını, sistem kapsayıcılarını, ArrangementView'u veya ayrılmış bölgeleri kullanın; menteşe olaylarını efektler ve etkileşimler için saklayın.
Menteşe için bir UITraitCollection özelliği var mı?
Hayır. Bir Apple mühendisi geliştirici forumlarında menteşe duruşu için trait collection özelliği bulunmadığını doğruladı. UIKit'te menteşe güncellemeleri için UIHingeInteraction kullanın.
Hangi oyunlar iPhone Duo menteşesini kontrol olarak kullanıyor?
Örnekler arasında katlamanın zemini rampaya çevirdiği Marbles Unhinged, katlayıp kapatmanın tost makinesinin kapağını kapattığı Toastie, dizüstü bilgisayar duruşunda alt yarıda vuruş yapılan Greens, masa üstü modundaki Battlefleet Duo ve bir açı tahmin oyunu olan Duometry var.
Kaynaklar
- Leverage multiple displays and scenes on iPhone Duo · Apple Developer (Tech Talk)
- Design for iPhone Duo · Apple Developer (Tech Talk)
- onHingeChange(isEnabled:_:) · Apple Developer Documentation
- DeviceHinge · Apple Developer Documentation
- UIHingeInteraction · Apple Developer Documentation
- UIHinge · Apple Developer Documentation
- Strike a pose with adaptive layouts on iPhone Duo · Apple Developer (Tech Talk)
- Recommended source of truth for adapting UIKit layouts on iPhone Duo · Apple Developer Forums
- Best practice for responding to the hinge angle in SwiftUI · Apple Developer Forums
- Hinge state adaptation in UIKit: Trait collections vs. view layout callbacks · Apple Developer Forums
- What can the APIs added in iOS 27.1 for iPhone Duo do? · DevelopersIO (Classmethod)
- iPhone Duo Apps, What Changes in Your Code and What to Do With Old Ones · Pasquale Pillitteri
- The iPhone Duo Can Be a Tiny Mac, a Toaster, and a Nintendo DS · MacRumors
- There are 3 hinge states: closed, partiallyOpen, and fullyOpen · @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.