⚠️Geräteausrichtung! = Schnittstellenausrichtung⚠️
Swift 5. * iOS13 und niedriger
Sie sollten wirklich einen Unterschied machen zwischen:
- Geräteorientierung => Zeigt die Ausrichtung des physischen Geräts an
- Schnittstellenausrichtung => Zeigt die Ausrichtung der auf dem Bildschirm angezeigten Schnittstelle an
Es gibt viele Szenarien, in denen diese beiden Werte nicht übereinstimmen, z.
- Wenn Sie Ihre Bildschirmausrichtung sperren
- Wenn Sie Ihr Gerät flach haben
In den meisten Fällen möchten Sie die Schnittstellenausrichtung verwenden und können diese über das Fenster abrufen:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
Wenn Sie auch <iOS 13 (z. B. iOS 12) unterstützen möchten, gehen Sie wie folgt vor:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
} else {
return UIApplication.shared.statusBarOrientation
}
}
Jetzt müssen Sie definieren, wo auf die Ausrichtung der Fensterschnittstellenausrichtung reagiert werden soll. Es gibt mehrere Möglichkeiten, dies zu tun, aber die optimale Lösung besteht darin, dies innerhalb zu tun
willTransition(to newCollection: UITraitCollection
.
Diese geerbte UIViewController-Methode, die überschrieben werden kann, wird jedes Mal ausgelöst, wenn die Ausrichtung der Benutzeroberfläche geändert wird. Folglich können Sie alle Ihre Änderungen in letzterem vornehmen.
Hier ist ein Lösungsbeispiel :
class ViewController: UIViewController {
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
super.willTransition(to: newCollection, with: coordinator)
coordinator.animate(alongsideTransition: { (context) in
guard let windowInterfaceOrientation = self.windowInterfaceOrientation else { return }
if windowInterfaceOrientation.isLandscape {
// activate landscape changes
} else {
// activate portrait changes
}
})
}
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
}
Durch die Implementierung dieser Methode können Sie dann auf jede Änderung der Ausrichtung Ihrer Benutzeroberfläche reagieren. Beachten Sie jedoch, dass es beim Öffnen der App nicht ausgelöst wird, sodass Sie Ihre Benutzeroberfläche auch manuell aktualisieren müssen viewWillAppear()
.
Ich habe ein Beispielprojekt erstellt, das den Unterschied zwischen Geräteorientierung und Schnittstellenorientierung unterstreicht. Darüber hinaus hilft es Ihnen, das unterschiedliche Verhalten zu verstehen, je nachdem, für welchen Lebenszyklusschritt Sie Ihre Benutzeroberfläche aktualisieren möchten.
Sie können das folgende Repository klonen und ausführen:
https://github.com/wjosset/ReactToOrientation