⚠️Орієнтація на пристрій! = Орієнтація на інтерфейс⚠️
Свіфт 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