⚠️ Device Orientation! = Interface Orientation⚠️
Swift 5. * iOS14 i starsze
Naprawdę powinieneś zrobić różnicę między:
- Device Orientation => Wskazuje orientację fizycznego urządzenia
- Orientacja interfejsu => Wskazuje orientację interfejsu wyświetlanego na ekranie
Istnieje wiele scenariuszy, w których te dwie wartości są niezgodne, na przykład:
- Gdy zablokujesz orientację ekranu
- Kiedy masz urządzenie płaskie
W większości przypadków chciałbyś użyć orientacji interfejsu i możesz to uzyskać za pomocą okna:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
Jeśli chcesz również obsługiwać <iOS 13 (na przykład iOS 12), wykonaj następujące czynności:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
} else {
return UIApplication.shared.statusBarOrientation
}
}
Teraz musisz zdefiniować, gdzie zareagować na zmianę orientacji interfejsu okna. Można to zrobić na wiele sposobów, ale optymalnym rozwiązaniem jest zrobienie tego w ramach
willTransition(to newCollection: UITraitCollection.
Ta odziedziczona metoda UIViewController, którą można przesłonić, zostanie wyzwolona za każdym razem, gdy orientacja interfejsu zostanie zmieniona. W konsekwencji możesz wprowadzić wszystkie swoje modyfikacje w tym drugim.
Oto przykład rozwiązania :
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 {
} else {
}
})
}
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
}
Wdrażając tę metodę, będziesz mógł reagować na każdą zmianę orientacji interfejsu. Pamiętaj jednak, że nie zostanie to uruchomione po otwarciu aplikacji, więc będziesz musiał również ręcznie zaktualizować interfejs w viewWillAppear().
Stworzyłem przykładowy projekt, który podkreśla różnicę między orientacją urządzenia a orientacją interfejsu. Dodatkowo pomoże Ci zrozumieć różne zachowania w zależności od tego, który etap cyklu życia zdecydujesz się zaktualizować swój interfejs użytkownika.
Zapraszam do sklonowania i uruchomienia następującego repozytorium:
https://github.com/wjosset/ReactToOrientation