Контроль, какой UIViewController отправляет UIWindow, долженAutorotateToInterfaceOrientation :? - PullRequest
0 голосов
/ 22 марта 2011

У меня есть приложение, которое использует иерархию представлений, управляемую несколькими UIVIewController объектами (* см. Примечания ниже), видимыми в окне в любой момент времени. И как таковой, я обнаружил, что по существу произвольно, какой из них получает вызов метода shouldAutorotateToInterfaceOrientation: при ротации устройства от UIWindow.

Как мне убедиться, что мой UIWindow объект вызывает мой самый высокий уровень UIViewController, а не какой-либо из его детей?

Кажется, это единственный способ, при котором анимация и изменения макета вращения распространяются корректно.

В «Руководстве по программированию View Controller» документация iOS гласит:

В приложении для iOS объект окна выполняет большую часть работы, связанной с изменением текущей ориентации. Однако он работает совместно с контроллерами представления приложения, чтобы определить, должно ли вообще происходить изменение ориентации, и если да, то какие дополнительные методы следует вызывать для реагирования на изменение. В частности, он работает с контроллером представления, корневой вид которого был недавно добавлен или представлен в окне. Другими словами, объект окна работает только с самым передним контроллером вида, вид которого отображался с использованием одного из механизмов, описанных в разделе «Представление вида контроллера вида».

Однако я обнаружил, что мой опыт отличается от этого. Когда UIWindow вызывает shouldAutorotateToInterfaceOrientation на конкретном дочернем контроллере представления, , даже если я удаляю и повторно добавляю представление моего контроллера верхнего уровня из UIWindow, он все равно вызывает того же дочернего элемента. Другими словами, сделать мой контроллер вида верхнего уровня последним добавленным видом не работает.

(*) Примечание: некоторые отмечают, что не рекомендуется использовать несколько контроллеров представления на одном экране. Я утверждаю, что это недостижимая цель в разных случаях. Рассмотрим приложение, которое показывает две таблицы (UITableViewControllers) одновременно. Или, в моем случае, приложение, которое требует пользовательского контроллера представления, который эмулирует UITabBarController из-за графических / художественных ограничений UITabBar. Я не вижу способа рефакторинга моего приложения, чтобы когда-либо отображать только один UIViewController (или его подкласс) одновременно.

UPDATE

Не находя непротиворечивого ответа (или демонстрируемого поведения) для того, что UIViewController вызывает объект UIWindow для обработки событий ориентации интерфейса, я пришел к выводу, что единственный правильный ответ - это вообще не ответ: просто не используйте несколько пользовательских Контроллеры UIView на одном экране (исключены UINavigationController и UITabBarController.)

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Это был бы контроллер вида, вид которого был помещен в окно первым или последним (извините, я забыл, какой).Поведение предсказуемо, но недокументировано и поэтому подвержено изменениям, поэтому не полагайтесь на него.Просто не включайте одновременно несколько активных / видимых контроллеров, как предлагалось в других ответах.

О, и в вашем примере с TabBar должна быть возможность создать подкласс UITabBar или, что еще лучше, использовать делегат,Таким образом, используя UITabBarViewController для управления вкладками, вы сможете рисовать собственную панель вкладок с помощью пользовательского представления.

0 голосов
/ 22 марта 2011

Я не уверен, что смогу ответить на ваш главный вопрос, но что касается ваших примеров того, почему вам нужны несколько контроллеров представления, то это могут быть просто представления.Я сделал много приложений с несколькими представлениями таблиц, но я использую обычный UITableView, а не UITableViewController.UITableViewController в значительной степени является просто контроллером представления по умолчанию для управления одним UITableView, он на самом деле мало что делает.

Звучит так, как будто вы используете контроллеры представления, для которых может быть достаточно обычных представлений.

...