Проблемы, связанные с ландшафтным режимом только для 1 экрана в приложении

Приложение заблокировано в портретной ориентации, но есть только этот видеоэкран, когда мне нужно также разрешить альбомную ориентацию. Моя реализация выглядит следующим образом:

in project file

настройка ориентации

Создан пользовательский навигационный контроллер и переопределены следующие методы:

- (NSUInteger)supportedInterfaceOrientations
{
    NSUInteger supportedOrientation =  [[self.viewControllers lastObject] supportedInterfaceOrientations];
    return supportedOrientation;
}

Теперь допустим, что в приложении у меня есть 4 контроллера представления следующим образом:

  1. Контроллер домашнего вида (книжная ориентация заблокирована)
  2. Контроллер представления списка (портрет заблокирован)
  3. Контроллер просмотра видео (портрет + альбом)
  4. Контроллер просмотра настроек (портрет заблокирован)

Таким образом, в каждом контроллере представления переопределяется

- (NSUInteger)supportedInterfaceOrientations
{
}

и вернул UIInterfaceOrientationMaskPortrait или UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight в зависимости от поддержки контроллера представления.

Я использую storyboard и Xcode 5.0.2. Наш настраиваемый контроллер навигации является корневым контроллером представления. Дом находится поверх него, и вид будет отображаться в зависимости от количества поддерживаемого списка, который мы либо останемся, либо перейдем к контроллеру представления списка, используя push segue.

Из видео и настройки контроллера просмотра у нас есть откат, который подключен к контроллеру Home View.

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

Проблемы:

  1. Если видео находится в альбомной ориентации, а затем мы переходим в настройки, настройки запускаются в ландшафтном режиме. Если повернуть один раз, он становится заблокированным в портретном режиме.
  2. В последовательности запуска в соответствии с реализацией из Home, если счетчик списка равен 0, мы переходим к контроллеру представления списка. В этом случае контроллер viewWillAppear of List вызывается правильно. Но, скажем, мы находимся на видео в альбомной ориентации и вызывается unwind segue, мы правильно перемещаемся из Home n, а затем в List View Controller, но viewWillAppear не вызывается в этом конкретном сценарии.

Некоторые предлагали также реализовать shoudAutorotate. Пытались вернуть НЕТ с портретных экранов и ДА с контроллера просмотра видео (тривиально shouldAutorotate реализовано для пользовательского навигационного контроллера, такого как реализация supportedInterfaceOrientations). Но при этом, если выполняются шаги из проблемы 1, экран настроек блокируется в альбомной ориентации.

Если есть другие предложения? или чего-то не хватает?




Ответы (2)


Если я правильно понимаю проблему, это метод, который вы ищете:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

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

person nhgrif    schedule 04.02.2014
comment
Эй, я пробовал это. Я реализовал выше во всех контроллерах представления, а также в моем пользовательском контроллере навигации, в котором я отправляю предпочтительную ориентацию последнего контроллера представления из массива контроллеров представления. получение того же результата, хотя и это не решило проблему. - person Sagrian; 18.02.2014

Проблема 1, я считаю, что это ожидаемое поведение: Источник: Force Rotate UIViewController

В итоге, если у вас есть представление, которое принимает только альбомную ориентацию, вы можете использовать следующее, чтобы заставить iOS изменить ориентацию. Это любопытно, но это работает. Прошу прощения, что не могу отдать должное оригинальному автору, но однажды наткнулся на это в другом месте на StackOverflow:

Проблема 2, я считаю, что вместо этого вы можете использовать соответствующие методы UINavigationController: navigationController:willShowViewController:animated:

person StuartM    schedule 04.02.2014