Приложение заблокировано в портретной ориентации, но есть только этот видеоэкран, когда мне нужно также разрешить альбомную ориентацию. Моя реализация выглядит следующим образом:
in project file
Создан пользовательский навигационный контроллер и переопределены следующие методы:
- (NSUInteger)supportedInterfaceOrientations
{
NSUInteger supportedOrientation = [[self.viewControllers lastObject] supportedInterfaceOrientations];
return supportedOrientation;
}
Теперь допустим, что в приложении у меня есть 4 контроллера представления следующим образом:
- Контроллер домашнего вида (книжная ориентация заблокирована)
- Контроллер представления списка (портрет заблокирован)
- Контроллер просмотра видео (портрет + альбом)
- Контроллер просмотра настроек (портрет заблокирован)
Таким образом, в каждом контроллере представления переопределяется
- (NSUInteger)supportedInterfaceOrientations
{
}
и вернул UIInterfaceOrientationMaskPortrait
или UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight
в зависимости от поддержки контроллера представления.
Я использую storyboard
и Xcode 5.0.2
. Наш настраиваемый контроллер навигации является корневым контроллером представления. Дом находится поверх него, и вид будет отображаться в зависимости от количества поддерживаемого списка, который мы либо останемся, либо перейдем к контроллеру представления списка, используя push segue.
Из видео и настройки контроллера просмотра у нас есть откат, который подключен к контроллеру Home View.
Если я перехожу от портрета (видео) к настройке, портрет остается заблокированным, как и ожидалось.
Проблемы:
- Если видео находится в альбомной ориентации, а затем мы переходим в настройки, настройки запускаются в ландшафтном режиме. Если повернуть один раз, он становится заблокированным в портретном режиме.
- В последовательности запуска в соответствии с реализацией из Home, если счетчик списка равен 0, мы переходим к контроллеру представления списка. В этом случае контроллер viewWillAppear of List вызывается правильно. Но, скажем, мы находимся на видео в альбомной ориентации и вызывается unwind segue, мы правильно перемещаемся из Home n, а затем в List View Controller, но viewWillAppear не вызывается в этом конкретном сценарии.
Некоторые предлагали также реализовать shoudAutorotate
. Пытались вернуть НЕТ с портретных экранов и ДА с контроллера просмотра видео (тривиально shouldAutorotate
реализовано для пользовательского навигационного контроллера, такого как реализация supportedInterfaceOrientations
). Но при этом, если выполняются шаги из проблемы 1, экран настроек блокируется в альбомной ориентации.
Если есть другие предложения? или чего-то не хватает?