Новые классы размера, основанные на автоповороте, - боль, если вам нужно нестандартное поведение. Вот мои требования и поток:
- View Controller 1 (VC1) представляет модально View Controller 2 (VC2)
VC1 поддерживает только альбомную, книжную или обе ориентации в зависимости от пользовательских настроек (достигается с помощью supportedInterfaceOrientations
). Для этого примера мы предполагаем, что он заблокирован в альбомной ориентации,
VC 2 поддерживает как альбомную, так и портретную ориентацию
Я использую классы размера, и в View Controller 1 я проверяю statusBarOrientation
в viewWillTransition
(для размера ...) для настройки расположения элементов интерфейса и других настроек.
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
let orientation = UIApplication.shared.statusBarOrientation
NSLog("View will transition to \(size), \(orientation.rawValue)")
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { [unowned self] (_) in
....
}
}
Это работает, за исключением случаев, когда VC 2 представлен и устройство повернуто. VC 1 все испортилось, когда VC 2 отклонен. Чтобы быть уверенным, я хотел бы обновить макет View Controller 1, когда он появится. Как я могу это сделать? Я попытался UIViewController.attemptRotationToDeviceOrientation (), но он не заставляет вызывать методы автоповорота снова.
EDIT: Как видно, в VC1 я проверяю statusBarOrientation, чтобы определить ориентацию интерфейса. Это создает проблему, потому что statusBarOrientation изменяется на портрет, когда VC2 поворачивается в портретный режим. И viewWillTransition к размеру вызывается на VC1 в то же время, когда я вынуждаю макет в портретный режим.