Было много беспорядка и ряда соответствующего ряда вопросов здесь на ПОЭТОМУ, как могут быть реализованы приложения для iPhone с правильным обращением для авторотации Среды/Режима портрета. Особенно трудно реализовать такое приложение, когда запуск в альбомном режиме желаем. Наиболее распространенный наблюдаемый эффект является скремблированными разметками и областями экрана, где касания больше не распознаются.
Отмечен простой поиск вопросов iphone
и landscape
показывает эти проблемы, которые происходят согласно определенным сценариям:
Альбомное только приложение для iPhone с несколькими перьями: Приложение запустилось в Альбомном режиме, представление от первого пера представляется прекрасное, все просматривает загруженный из различного пера, не отображен правильно.
Iphone Landscape mode, переключающийся на режим Portraite при загрузке нового контроллера: Сам объяснительный
iPhone: В только для среды, после первого addSubview, UITableViewController не вращается правильно: Та же проблема как выше.
iPhone Landscape-Only Utility-Template Application: ошибки Расположения, контроллер, кажется, не распознает, что представление должно быть повернуто, но отображает отсеченное представление портрета в альбомном режиме, заставляя половину экрана остаться пробел.
presentModalViewController в среде после портрета viewController: Модальные представления правильно не представляются также.
Ряд различных решений был представлен, некоторые из них включая абсолютно пользовательскую анимацию через CoreGraphics, в то время как другие основываются на наблюдении, что первый контроллер представления, загруженный из основного пера, всегда отображается корректный.
Я потратил существенное количество времени, исследовав эту проблему и наконец нашел решение, которое не является только частичным решением, но и должно работать при всех этих обстоятельствах. Это - мой намеревающееся с этим сообщением CW обеспечить вид FAQ для других, имеющих проблемы с UIViewControllers в Альбомном режиме.
Обеспечьте обратную связь, и справка улучшают качество этого Сообщения путем слияния любых связанных наблюдений. Не стесняйтесь редактировать и отправлять другие/лучше ответы, если Вы знаете о ком-либо.
В вашем контроллере представления переопределите shouldAutorotateToInterfaceOrientation: для объявления поддерживаемых вами ориентаций интерфейса. Это свойство будет/должно проверяться инфраструктурой контроллера при каждом изменении ориентации устройства.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation
{
return (orientation == UIInterfaceOrientationLandscapeRight);
}
Это абсолютный минимум того, что должен делать ваш контроллер представления. Если вы хотите запускать свое приложение в альбомном режиме, вам нужно добавить следующий ключ в ваш .plist
файл:
<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
Apple рекомендует запускать приложения с альбомной ориентацией в режиме Landscape Right (см. the HIG в разделе User Experience Guidelines > Start Instantly).
Каждый раз, когда вы пытаетесь загрузить другой контроллер представления, отличный от того, который загружен из главного пера, ваш контроллер представления не опрашивается о поддерживаемых ориентациях интерфейса и его рамка не устанавливается правильно. Только первый контроллер представления, привязанный к окну, будет размещен правильно.
Другие люди предлагали использовать "MasterViewController", привязанный к главному окну, к которому другие контроллеры добавляют свои представления в качестве вложенных представлений вместо того, чтобы подключаться непосредственно к окну. Хотя я нашел это решение жизнеспособным, оно не работает корректно в случае модальных контроллеров представления, добавленных к этим упомянутым вложенным представлениям. Также есть проблема, если у вас есть некоторые вложенные представления, которые должны иметь возможность автоповорота (что главный контроллер предотвращает).
Использование недокументированных API для принудительной ориентации интерфейса тоже не вариант.
Лучшее решение, которое я нашел на данный момент - это модификация обходного пути "MasterViewController". Вместо пользовательского "MasterViewController" используется UINavigationController
со скрытой панелью навигации и скрытой панелью вкладок. Если все остальные представления выталкиваются/выталкиваются из навигационного стека этого контроллера, автоповороты контроллеров в этом стеке будут управляться корректно.
Модальные контроллеры, представленные через presentModalViewController:animated:
из любого контроллера представления в навигационном стеке UINavigationController
, будут повернуты и отображены с правильным расположением. Если вы хотите, чтобы ваш модальный контроллер представления был повернут в ориентацию, отличную от ориентации родительского контроллера представления, вам необходимо вернуть желаемую ориентацию из метода shouldAutorotateToInterfaceOrientation
контроллера parent во время представления модального представления. Чтобы правильно восстановить ориентацию интерфейса при удалении модального контроллера, необходимо убедиться, что shouldAutorotateToInterfaceOrientation
возвращает желаемую ориентацию для родительского контроллера до вызова dismissModalViewController:animated:
. Вы можете использовать приватный BOOL
на вашем контроллере представления для управления этим (например, BOOL isModalMailControllerActive_
).
Я скоро добавлю пример кода, сейчас уже поздно. Пожалуйста, дайте мне знать, если остались нерешенные вопросы или что-то непонятно в этом сообщении. Не стесняйтесь редактировать и улучшать.