2015-12-02 4 views
0

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

При поиске способов ограничения ориентации пользовательского интерфейса UIViewController появляются методы, которые появляются supportedInterfaceOrientations() и preferredInterfaceOrientationForPresentation(). И не совсем работа для меня:

  • supportedInterfaceOrientations() работает только один раз, когда представление будет загружен, так что даже если я его возвращаемое значение условной, она не запускается после изменения состояния.
  • Контроллеры моего представления представлены внутри стека навигации, а не модально, поэтому preferredInterfaceOrientationForPresentation() не запускается вообще.

Есть ли способ добиться эффекта, который я ищу?

+0

Когда вы говорите, что 'supportedInterfaceOrientations()' запускается только при загрузке представления, что вы имеете в виду? Можете ли вы рассказать об этом? –

+0

Значение, когда инициализируется и загружается viewController, выполняется метод. Затем пользователь нажимает кнопку, а флаг устанавливается для ограничения ориентации. Затем, если я вращаю устройство, он вращается, и я вижу в отладчике, что 'supportedInterfaceOrientations()' никогда не запускался снова после этого первого раза. Могу ли я заставить ОС обновлять свои данные на поддерживаемых ориентациях, снова вызвав метод? – SaltyNuts

ответ

1

Я собираюсь предположить, что контроллеры вашего вида находятся в контроллере навигации. Без контроллера навигации вызывается supportedInterfaceOrientations() всякий раз, когда устройство поворачивается. ОДНАКО, когда встроено в контроллер навигации, контроллер навигации решает, должен ли контроллер просмотра вращаться. (См. Примеры ниже) enter image description here enter image description here

Что вам нужно сделать? Реализовать supportedInterfaceOrientations() в пользовательской UINavigationController так:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
    if self.topViewController is RootViewController { 
     return .Portrait 
    } else { 
     return .All 
    } 
} 

Это дубликатом вопрос this, но я не видел быстрый пример. Для любого класса, который вы хотите сохранить в портрете, просто замените RootViewController на имя класса.

+0

Agh! Этот навигационный контроллер! Получает меня каждый раз! – SaltyNuts

+0

Очевидно, что 'UITabBarController' также имеет такую ​​же проблему. Добавление этого же переопределения в пользовательский 'UITabBarController' разрешает это. – SaltyNuts

+0

Определенно то, что можно легко упустить! –