У меня есть приложение, которое использует иерархию представлений, управляемую несколькими UIVIewController
объектами (* см. Примечания ниже), видимыми в окне в любой момент времени. И как таковой, я обнаружил, что по существу произвольно, какой из них получает вызов метода shouldAutorotateToInterfaceOrientation:
при ротации устройства от UIWindow
.
Как мне убедиться, что мой UIWindow
объект вызывает мой самый высокий уровень UIViewController
, а не какой-либо из его детей?
Кажется, это единственный способ, при котором анимация и изменения макета вращения распространяются корректно.
В «Руководстве по программированию View Controller» документация iOS гласит:
В приложении для iOS объект окна выполняет большую часть работы, связанной с изменением текущей ориентации. Однако он работает совместно с контроллерами представления приложения, чтобы определить, должно ли вообще происходить изменение ориентации, и если да, то какие дополнительные методы следует вызывать для реагирования на изменение. В частности, он работает с контроллером представления, корневой вид которого был недавно добавлен или представлен в окне. Другими словами, объект окна работает только с самым передним контроллером вида, вид которого отображался с использованием одного из механизмов, описанных в разделе «Представление вида контроллера вида».
Однако я обнаружил, что мой опыт отличается от этого. Когда UIWindow
вызывает shouldAutorotateToInterfaceOrientation
на конкретном дочернем контроллере представления, , даже если я удаляю и повторно добавляю представление моего контроллера верхнего уровня из UIWindow
, он все равно вызывает того же дочернего элемента. Другими словами, сделать мой контроллер вида верхнего уровня последним добавленным видом не работает.
(*) Примечание: некоторые отмечают, что не рекомендуется использовать несколько контроллеров представления на одном экране. Я утверждаю, что это недостижимая цель в разных случаях. Рассмотрим приложение, которое показывает две таблицы (UITableViewControllers) одновременно. Или, в моем случае, приложение, которое требует пользовательского контроллера представления, который эмулирует UITabBarController из-за графических / художественных ограничений UITabBar. Я не вижу способа рефакторинга моего приложения, чтобы когда-либо отображать только один UIViewController (или его подкласс) одновременно.
UPDATE
Не находя непротиворечивого ответа (или демонстрируемого поведения) для того, что UIViewController вызывает объект UIWindow для обработки событий ориентации интерфейса, я пришел к выводу, что единственный правильный ответ - это вообще не ответ: просто не используйте несколько пользовательских Контроллеры UIView на одном экране (исключены UINavigationController и UITabBarController.)