Что в документации :
В вашем контроллере представления переопределите shouldAutorotateToInterfaceOrientation: объявить поддерживаемые ориентации интерфейса. Это свойство будет / должно проверяться инфраструктурой контроллера при каждом изменении ориентации устройства.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation
{
return (orientation == UIInterfaceOrientationLandscapeRight);
}
Это абсолютный минимум, который необходим вашему контроллеру представления. Если вы хотите запустить приложение в альбомном режиме, вам необходимо добавить следующий ключ в ваш файл .plist
:
<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
Apple рекомендует запускать приложения только в альбомной ориентации в режиме альбомной ориентации (см. HIG в разделе Руководства по работе с пользователем> Начать мгновенно).
Чего нет в документации:
Небольшой фон:
Каждый раз, когда вы пытаетесь загрузить другой контроллер представления, отличный от того, который загружен из основного пера, ваш контроллер представления не опрашивается ни о поддерживаемых ориентациях интерфейса, ни о его кадре. Только первый контроллер вида, привязанный к окну, будет правильно выложен.
Другие люди предложили использовать «MasterViewController», подключенный к главному окну, к которому другие контроллеры добавляют свои представления в качестве подпредставлений, а не подключать непосредственно к окну. Хотя я нашел, что это решение является жизнеспособным вариантом, оно не работает должным образом в случае модальных контроллеров представления, добавленных к тем упомянутым подпредставлениям. Также существует проблема, если у вас есть некоторые подпредставления, которые должны иметь возможность автоматического поворота (что будет предотвращать главный контроллер).
Использование недокументированных API для навязывания определенной ориентации интерфейса также не вариант.
Решение:
Лучшее решение, которое я нашел на данный момент, - это модификация обходного пути MasterViewController. Вместо использования собственного «MasterViewController» используется UINavigationController
со скрытой панелью навигации и скрытой панелью вкладок. Если все другие представления будут вытолкнуты / извлечены из стека навигации этого контроллера, автоматическое вращение контроллеров в этом стеке будет управляться правильно.
Модальные контроллеры, представленные через presentModalViewController:animated:
от любого из контроллеров представления в стеке навигации UINavigationController
, будут вращаться и отображаться с правильной компоновкой. Если вы хотите, чтобы ваш модальный контроллер вида мог вращаться с ориентацией, отличной от ориентации родительского контроллера вида, вам необходимо вернуть желаемую ориентацию из метода shouldAutorotateToInterfaceOrientation
родительского контроллера , пока модальный вид представил. Чтобы правильно восстановить ориентацию интерфейса, когда модальный контроллер отключен, вам необходимо убедиться, что shouldAutorotateToInterfaceOrientation
возвращает желаемую ориентацию для родительского контроллера, прежде чем вы вызовете dismissModalViewController:animated:
. Вы можете использовать личный BOOL
на вашем контроллере представления для управления этим (например, BOOL isModalMailControllerActive_
).
Я скоро добавлю пример кода, сейчас слишком поздно. Пожалуйста, дайте мне знать, если остались какие-либо нерешенные вопросы или что-то неясно в этом посте Не стесняйтесь редактировать и улучшать.