Entwickler
Scharnierstatus des iPhone Duo: onHingeChange und UIHingeInteraction
Scharnierstatus und -winkel des iPhone Duo mit onHingeChange oder UIHingeInteraction in iOS 27.1 auslesen, für Effekte und Spielsteuerung nutzen, mit Beispielen.
Von der AppleDuo-RedaktionVeröffentlicht 6 Min. Lesezeit
Auf dieser Seite
- Welche Scharnierzustände meldet das iPhone Duo?
- Wie verwende ich .onHingeChange in SwiftUI?
- Wie beobachte ich das Scharnier in UIKit mit UIHingeInteraction?
- Sollte der Scharnierstatus mein Layout steuern?
- Wie gestalte ich für den Tabletop-Modus?
- Welche Spiele machen das Scharnier zur Steuerung?
- Das Wichtigste in Kürze
iPhone Duo ist das erste iPhone mit Scharnier, und mit iOS 27.1 kann Ihre App es auslesen. Sie erfahren, ob das Gerät zugeklappt, teilweise geöffnet oder vollständig geöffnet ist, und können den genauen Scharnierwinkel verfolgen, während jemand es faltet. Dieser Leitfaden behandelt die APIs für den Scharnierstatus des iPhone Duo in SwiftUI und UIKit, wann Sie sie einsetzen sollten und wann nicht, und zeigt Spiele, die das Falten bereits zur Steuerung machen.
Die Details stammen aus Apples Dokumentation, Apples Tech Talks und Forenantworten zum iPhone Duo sowie aus einem Beitrag des iOS-Entwicklers @sarunw. Wir haben diese APIs nicht auf Hardware getestet. Sie wurden mit iOS 27.1 und Xcode 27.1 ausgeliefert, Namen und Verhalten können sich in späteren Releases also noch ändern.
Welche Scharnierzustände meldet das iPhone Duo?
Wie @sarunw zusammenfasst: „Es gibt 3 Scharnierzustände: closed, partiallyOpen und fullyOpen.“ Apples Tech Talk Leverage multiple displays and scenes on iPhone Duo beschreibt denselben „übergeordneten Scharnierstatus“ und ergänzt, dass die API auch „kontinuierliche Updates des Scharnierwinkels“ liefert.
Laut Apples Dokumentation wird der Status „vom System anhand des aktuellen Winkels und der Geräteausrichtung bestimmt“. Mit anderen Worten: Sie erhalten einen einfachen Zustand für Entscheidungen und einen präzisen Winkel für alles, was sich flüssig bewegen soll.
| Status | SwiftUI (DeviceHinge.Status) | UIKit (UIHinge.Status) | Apples Beschreibung |
|---|---|---|---|
| Zugeklappt | .closed | .closed | Das Scharnier ist geschlossen |
| Teilweise geöffnet | .partiallyOpen | .partiallyOpen | Das Scharnier ist teilweise geöffnet |
| Vollständig geöffnet | .fullyOpen | .fullyOpen | So weit geöffnet, wie das Gerät es zulässt |
| Unbekannt | nicht aufgeführt | .unknown | Der Status ist unbekannt |
Der Typ des Winkels unterscheidet sich je nach Framework. In SwiftUI ist DeviceHinge.angle ein Angle. In UIKit ist UIHinge.angle ein CGFloat im Bogenmaß.
Wie verwende ich .onHingeChange in SwiftUI?
Die SwiftUI-API ist onHingeChange(isEnabled:_:), verfügbar ab iOS 27.1. Ihre Aktion erhält zwei DeviceHingeContext-Werte, den vorherigen und den neuen. Jeder Kontext hat ein optionales hinge vom Typ DeviceHinge, das angle und status bereitstellt.
Dieses Beispiel aus Apples Dokumentation speichert das Scharnier im State und zeigt einen Fallback, wenn kein Scharnier verfügbar ist:
@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
}
}
Ein nil-Scharnier bedeutet, dass das Gerät keines hat, behandeln Sie diesen Fall also immer. Der Parameter isEnabled ist standardmäßig true.
Alte und neue Werte nutzen
Da die Closure beide Kontexte erhält, können Sie einen Übergang erkennen, etwa den Moment, in dem das Gerät zugeklappt wird. Dies ist unsere eigene Skizze, die nur auf den dokumentierten Typen aufbaut:
.onHingeChange { oldContext, newContext in
let wasClosed = oldContext.hinge?.status == .closed
let isClosed = newContext.hinge?.status == .closed
if !wasClosed && isClosed {
game.closeLid()
}
}
game.closeLid() steht stellvertretend für Ihren eigenen Code. Der Vergleich von altem und neuem Wert verhindert, dass dieselbe Aktion zweimal läuft, wenn sich nur der Winkel ändert.
Wie beobachte ich das Scharnier in UIKit mit UIHingeInteraction?
Fügen Sie in UIKit einer View eine UIHingeInteraction hinzu. Ihr Handler läuft, „wenn sich der Scharnierstatus ändert oder wenn die Interaction zwischen Hierarchien wechselt“. Verlässt die View eine Hierarchie, die Scharnier-Updates liefert, ist hinge im Update nil. Apples Beispiel:
override func viewDidLoad() {
super.viewDidLoad()
let interaction = UIHingeInteraction { [weak self] _, update in
guard let self else { return }
// Ein `hinge` mit nil bedeutet, dass die Interaction eine
// Hierarchie verlassen hat, die Scharnier-Updates liefert.
guard let hinge = update.hinge else {
handleHingeUnavailable()
return
}
updateAngleDisplay(with: hinge.angle)
updateStatusDisplay(with: hinge.status)
}
view.addInteraction(interaction)
}
Die Interaction hat außerdem eine Eigenschaft isEnabled. Suchen Sie Scharnierinformationen nicht in der Trait Collection. Ein Apple-Ingenieur hat in den Entwicklerforen bestätigt, dass es keine UITraitCollection-Traits für die Scharnierhaltung gibt.
Sollte der Scharnierstatus mein Layout steuern?
Nein. Das ist die wichtigste Regel. Apples Tech Talk sagt: „Scharnierdaten werden live beobachtet und eignen sich ideal, um Interaktionen oder Effekte zu steuern. Für das Layout verwenden Sie die Arrangement- und Region-APIs.“
In den Foren nannte ein Apple Technology Evangelist vier Ansätze, vom einfachsten bis zum individuellsten:
- Verwenden Sie einen Systemcontainer wie
NavigationSplitViewoderUISplitViewController. - Reicht das nicht, probieren Sie
ArrangementViewoderUIArrangementViewController. - Nur wenn beides nicht funktioniert, positionieren Sie Views mit den Reserved-Region-APIs.
- Verwenden Sie
onHingeChangeoder die Hinge-Interaction-API nicht für Layout-Entscheidungen.
Für das Layout lautet Apples Empfehlung in den Foren, gerätespezifische Logik zu vermeiden und auf Size Classes zu setzen, die sich ändern, wenn das Gerät auf- oder zugeklappt wird. Unsere Leitfäden zu Size Classes auf dem iPhone Duo, ArrangementView und Reserved Regions und der Faltkante behandeln diese Werkzeuge. Die Teilungsregion der Faltkante ist nur aktiv, wenn das Gerät gefaltet ist, Reserved Regions sagen Ihnen also bereits, wo der Knick liegt.
Scharnier-Events sind für Dinge gedacht, die auf Bewegung reagieren sollen: ein Zoom-Effekt auf einem Hintergrundbild, ein Cover, das sich mit dem Falten öffnet, oder eine Spielmechanik. Apples Tech Talk baut eine Gitarren-App, in der ein teilweise gefaltetes Scharnier wie ein Tremolohebel funktioniert:
.onHingeChange { _, context in
if let hinge = context.hinge, hinge.status == .partiallyOpen {
pitchBend = calculatePitchBend(angle: hinge.angle)
}
else {
pitchBend = 0
}
}
Das Bending gilt nur im Zustand .partiallyOpen und wird sonst zurückgesetzt. Apple zeigt den Rumpf von calculatePitchBend nicht, die Abbildung vom Winkel auf den Effekt liegt also bei Ihnen.
Wie gestalte ich für den Tabletop-Modus?
Wenn das iPhone Duo „wie ein Laptop mit dem inneren Display zu Ihnen gewandt“ auf einem Tisch steht, ist die untere Hälfte eine stabile Basis und die obere Hälfte gut im Blick. Apples Tech Talk „Design for iPhone Duo“ schlägt vor, dass „Medien oben sitzen können, während antippbare Steuerelemente auf einer stabilen Basis unten liegen“.
Es gibt einen Haken. Apple ergänzt, dass ein spezielles Layout für diese Haltung „dieselben Steuerelemente und die allgemeine Hierarchie wie andere Haltungen“ beibehalten sollte, denn „Sie wollen Funktionen nicht an eine bestimmte Haltung binden“. Für Apps heißt das: Der Tabletop-Modus darf Inhalte neu anordnen, aber jede Funktion muss auch dann funktionieren, wenn das Gerät flach liegt oder zugeklappt ist.
Spiele haben mehr Freiheit, da die Haltung der eigentliche Spaß sein kann. Trotzdem hilft es, einen Fallback anzubieten. Marbles Unhinged etwa gibt im App Store an, dass es auch auf jedem iPhone oder iPad mit einem Scharnier auf dem Bildschirm spielbar ist.
Welche Spiele machen das Scharnier zur Steuerung?
Mehrere iPhone-Duo-Spiele nutzen die Faltung bereits als Eingabe. Die Beschreibungen unten stammen aus dem App-Store-Eintrag des jeweiligen Spiels und aus Presseberichten. Wir wissen nicht, welche APIs die einzelnen Entwickler intern verwendet haben.
| Spiel | Was das Scharnier bewirkt |
|---|---|
| Marbles Unhinged | Biegen Sie die obere Hälfte, und ihr Boden wird zur Rampe. Je steiler die Faltung, desto schneller rollt die Kugel. |
| Toastie | Klappen Sie das Telefon zu, um den Toasterdeckel zu schließen, und öffnen Sie es dann, um nach dem Sandwich zu sehen. |
| Greens: Mini-golf | Falten Sie es wie einen Laptop und putten Sie auf der unteren Hälfte, während die aufgestellte Hälfte zur Caddie-Kamera wird. |
| Battlefleet Duo | Im Tabletop-Modus liegt Ihre Flotte auf dem unteren Bildschirm, und die gegnerischen Gewässer stehen vor Ihnen auf, mit Spiel von Angesicht zu Angesicht für zwei. |
| Duometry | Laut MacRumors falten Sie das Gerät auf einen Zielwinkel und loggen damit Ihren Tipp ein. |
Diese Beispiele lassen sich sauber den APIs zuordnen. Toasties Deckel ist ein Statuswechsel zu .closed. Die Rampe von Marbles Unhinged ist ein kontinuierlicher Winkel. Greens und Battlefleet Duo sind Tabletop-Layouts, bei denen die obere Hälfte eine Ansicht zeigt und die untere Hälfte Berührungen aufnimmt. Duometry braucht den rohen Winkel.
Weitere Spiele, die die Faltung nutzen, finden Sie auf Built for the Fold.
Das Wichtigste in Kürze
- iPhone Duo meldet drei Scharnierzustände,
closed,partiallyOpenundfullyOpen, dazu einen kontinuierlichen Winkel. UIKit kennt außerdemunknown. - Verwenden Sie
.onHingeChangein SwiftUI oderUIHingeInteractionin UIKit. Beide sind neu in iOS 27.1, und beide liefern einnil-Scharnier, wenn keines verfügbar ist. - Die SwiftUI-Closure erhält alten und neuen Kontext, Sie können also auf Übergänge reagieren statt auf jedes Winkel-Update.
- Überlassen Sie das Layout Size Classes, Systemcontainern, ArrangementView und Reserved Regions. Nutzen Sie Scharnierdaten für Effekte, Interaktionen und Spielmechaniken.
- Tabletop-Designs sollten Medien oben und Steuerelemente auf der Basis platzieren, ohne Funktionen in anderen Haltungen zu verstecken.
Erfahren Sie als Nächstes in unserem Leitfaden zu Reserved Regions, wie Sie Steuerelemente aus dem Knick heraushalten, oder spielen Sie die oben genannten Spiele über Built for the Fold.
Häufige Fragen
Welche Scharnierzustände gibt es beim iPhone Duo?
Es gibt drei: closed, partiallyOpen und fullyOpen. Das System wählt den Status anhand des aktuellen Winkels und der Geräteausrichtung. Das UIKit-Enum enthält zusätzlich einen Fall unknown.
Wie lese ich den Scharnierwinkel in SwiftUI aus?
Fügen Sie einer View .onHingeChange hinzu. Die Closure erhält den vorherigen und den neuen Scharnierkontext, und die Eigenschaft hinge des neuen Kontexts liefert einen Winkel und einen Status. Auf Geräten ohne Scharnier ist hinge nil.
Sollte ich den Scharnierstatus nutzen, um mein Layout zu ändern?
Nein. Laut Apple sollten onHingeChange und die Hinge-Interaction-API nicht für Layout-Entscheidungen verwendet werden. Nutzen Sie für das Layout Size Classes, Systemcontainer, ArrangementView oder Reserved Regions, und reservieren Sie Scharnier-Events für Effekte und Interaktionen.
Gibt es einen UITraitCollection-Trait für das Scharnier?
Nein. Ein Apple-Ingenieur hat in den Entwicklerforen bestätigt, dass es keine Trait-Collection-Traits für die Scharnierhaltung gibt. Verwenden Sie in UIKit UIHingeInteraction für Scharnier-Updates.
Welche Spiele nutzen das Scharnier des iPhone Duo als Steuerung?
Beispiele sind Marbles Unhinged, bei dem das Falten den Boden in eine Rampe verwandelt, Toastie, bei dem das Zuklappen den Toasterdeckel schließt, Greens, das in Laptop-Haltung auf der unteren Hälfte puttet, Battlefleet Duo im Tabletop-Modus und Duometry, ein Spiel zum Erraten von Winkeln.
Quellen
- 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
Machen Sie das Scharnier zum Teil Ihrer App.
Wir stellen Apps und Spiele vor, die mit dem iPhone Duo wirklich etwas anfangen. Schicken Sie uns Ihre mit einem Link zum App Store – oder sehen Sie sich an, was andere gebaut haben.