Вращающиеся контроллеры представления в иерархии контроллера панели вкладок -> Контроллер навигации -> Контроллер представления - PullRequest
3 голосов
/ 30 января 2011

В моем приложении иерархия контроллера представления настроена так:

UITabBarController
    |
    UINavigationController
    |  |
    |  UIViewController
    |
    UINavigationController
       |
       UIViewController

Все мои контроллеры представления, которые находятся в этой иерархии, переопределяют метод:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

и возврат YES - поэтому контроллер вида должен иметь возможность вращаться на любом повороте - даже вверх ногами.

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

Почему мои контроллеры вида не вращаются?

Единственный способ заставить их вращаться - это создать подкласс UINavigationController и переопределить его shouldAutorotate метод, но мне это не нужно, и мне было интересно, если я что-то упустил, чтобы сделать это работа.

Edit:

В соответствии с практическими рекомендациями по кодированию:

Если вы также используете панель инструментов, контроллер представления для каждого элемента панели инструментов должен реализовывать метод shouldAutorotateToInterfaceOrientation: и возвращать YES для каждой ориентации, которую вы хотите поддерживать. Если у вас есть контроллер навигации для элемента панели инструментов, контроллер корневого представления этого контроллера навигации должен реализовать метод shouldAutorotateToInterfaceOrientation: и вернуть YES.

Там написано «панель инструментов» - но я думаю, что это опечатка и, вероятно, предполагается, что это «панель вкладок».

Так что, похоже, я правильно это реализую, но мои контроллеры все еще не вращаются автоматически.

Ответы [ 5 ]

4 голосов
/ 30 января 2011

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

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

Я создал тест, чтобы показать это ( RotationTest на GitHub ), но, похоже, все работает.Надеюсь, я помню, почему в какой-то момент мне это не удалось.

0 голосов
/ 18 августа 2012

Я разработал расширение, которое позволяет вам делать это без подкласса UITabBarController https://github.com/piercifani/TabBarBetterRotation

0 голосов
/ 17 августа 2012

Подкласс UITabBarController, а также UINavigationController. Работает как xCode 4.4.

0 голосов
/ 30 января 2011

Единственный способ заставить их вращаться - это создать подкласс UINavigationController и переопределить его метод shouldAutorotate, но мне это не нужно, и мне было интересно, если я что-то упустил, чтобы сделать эту работу.

Я точно не знаю, является ли это неправильным подходом, но я бы создал подкласс UITabBarController раньше, чем UINavigationController. Кроме того, вы можете попробовать обернуть все в подклассный UIViewController, который реализует метод поворота, но это создаст дополнительную нагрузку на дополнительное представление. Однажды я попытался сделать ротацию с UINavigationController, но это было не красиво. Я подозреваю, что причина, по которой представления вращаются только в том случае, если вы создаете подкласс UINavigationController, заключается в том, что иерархия представлений будет проходить только поворот, если вращается родительский элемент. Если родитель не вращается, ребенок не будет. (Представьте себе iPhone в док-станции. IPhone может вращаться только при вращении док-станции. Теперь сравните док-станцию ​​с чехлом iPhone. Чехол также можно вращать, поэтому iPhone тоже будет вращаться.)

Там написано «панель инструментов» - но я думаю, что это опечатка и, вероятно, предполагается, что это «панель вкладок».

Я не думаю, что HIG имеет опечатку в этом отношении. Условия могут быть взаимозаменяемыми.

Как правило, «панель инструментов» относится к представлению, в котором она содержится, и поэтому должна вращаться вместе с родительским представлением. Однако панель вкладок является «родителем», так сказать, контроллера представления на экране. Следовательно, контроллер представления должен вращаться, только если вращается все приложение. Эта концепция в основном сводится к следующему: какой вид (панель или контроллер вида) зависит от другого? (Панель вкладок является постоянной, но виды меняются, или панель инструментов доступна только в том случае, если вид виден.)

0 голосов
/ 30 января 2011

Вы пытались создать подкласс контроллера Tabbar и установить его в качестве контроллера tabbar?Там установите

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

на

YES
...