Нет вызова shouldAutorotateToInterfaceOrientation при использовании настраиваемого TabBarController

Я создал собственный TabBarController, который наследуется от UIViewController (НЕ UITabBarController, потому что он не предназначен для создания подклассов). Все работает нормально, кроме поддержки ориентации.

Мой TabBarController установлен как rootViewController в моем UIWindow и содержит внутренний массив UIViewControllers. В моем случае я добавил UINavigationControllers как корень каждой вкладки.

При нажатии нового UIViewController на любой из моих UINavigationController в моем TabBarController я получаю вызов shouldAutorotateToInterfaceOrientation, это нормально, потому что здесь я могу установить, какой UIViewController должен поддерживать какую ориентацию (как описано в документации Apple).

Однако, когда я возвращаюсь, нажав кнопку «Назад» в UINavigationBar, я не получаю вызова shouldAutorotateToInterfaceOrientation, поэтому отображаемое представление окажется в неправильной ориентации.

Я провел быстрый тест, заменив свой собственный TabBarController на UITabBarController, и я получаю вызов shouldAutorotateToInterfaceOrientation при нажатии кнопки возврата, поэтому здесь должно быть что-то не так, но я не могу понять, что.

Почему я не получаю вызовы shouldAutorotateToInterfaceOrientation? UITabBarController делает что-то, что я пропустил?

Кто-нибудь здесь испытывал такую ​​же проблему? Есть ли у вас идеи, которые стоит попробовать, потому что у меня они закончились.

ИЗМЕНИТЬ

Эта проблема решается путем добавления каждого UIViewController в TabBarController в качестве дочернего с помощью контроллера представления контейнера iOS5.

Добавьте UIViewController в качестве дочернего элемента с помощью этого метода: addChildViewController Затем автоматически переопределите ForwardAppearanceAndRotationMethodsToChildViewControllers и верните YES.

Теперь вы должны получить обратные вызовы shouldAutorotateToInterfaceOrientation в ваших UIViewControllers.


person Markus Persson    schedule 18.01.2012    source источник


Ответы (1)


Я сталкивался с такими проблемами раньше, и это всегда сводилось к добавлению метода -shouldAutorotateToInterfaceOrientation: ко всем контроллерам представления, а не только к самому верхнему, как вы могли ожидать.

(а если вам лень, просто добавьте категорию в UIViewController)

person mvds    schedule 18.01.2012
comment
Я добавил этот метод ко всем контроллерам представления, но до сих пор не получаю вызова. Однако я только что прочитал о новых контроллерах представления контейнера в iOS5. Добавив мои контроллеры представления в контроллер панели вкладок в качестве дочернего элемента с addChildViewController и автоматически переопределивForwardAppearanceAndRotationMethodsToChildViewControllers, возвращая YES, я получу обратный вызов shouldAutorotateToInterfaceOrientation! - person Markus Persson; 18.01.2012
comment
здорово. помните, что контроллеры представления, которые вы используете без создания подклассов, также являются контроллерами представления. - person mvds; 18.01.2012