⚠️Device Orientation! = Ориентация интерфейса⚠️
Swift 5. * iOS14 и ниже
Вам действительно стоит различать:
- Ориентация устройства => Указывает ориентацию физического устройства
- Ориентация интерфейса => Указывает ориентацию интерфейса, отображаемого на экране
Существует множество сценариев, в которых эти 2 значения не совпадают, например:
- Когда вы блокируете ориентацию экрана
- Когда у вас плоское устройство
В большинстве случаев вы захотите использовать ориентацию интерфейса, и вы можете получить ее через окно:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
Если вы также хотите поддерживать <iOS 13 (например, iOS 12), вы должны сделать следующее:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
} else {
return UIApplication.shared.statusBarOrientation
}
}
Теперь нужно определить, где реагировать на изменение ориентации интерфейса окна. Есть несколько способов сделать это, но оптимальное решение - сделать это внутри
willTransition(to newCollection: UITraitCollection.
Этот унаследованный метод UIViewController, который можно переопределить, будет срабатывать каждый раз при изменении ориентации интерфейса. Следовательно, вы можете делать все свои модификации в последнем.
Вот пример решения :
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
}
}
Реализовав этот метод, вы сможете реагировать на любое изменение ориентации вашего интерфейса. Но имейте в виду, что он не будет запускаться при открытии приложения, поэтому вам также придется вручную обновить свой интерфейс в viewWillAppear().
Я создал образец проекта, который подчеркивает разницу между ориентацией устройства и ориентацией интерфейса. Кроме того, это поможет вам понять различное поведение в зависимости от того, на каком этапе жизненного цикла вы решили обновить свой пользовательский интерфейс.
Не стесняйтесь клонировать и запускать следующий репозиторий:
https://github.com/wjosset/ReactToOrientation