iPhone Landscape FAQ и Решения

Было много беспорядка и ряда соответствующего ряда вопросов здесь на ПОЭТОМУ, как могут быть реализованы приложения для iPhone с правильным обращением для авторотации Среды/Режима портрета. Особенно трудно реализовать такое приложение, когда запуск в альбомном режиме желаем. Наиболее распространенный наблюдаемый эффект является скремблированными разметками и областями экрана, где касания больше не распознаются.

Отмечен простой поиск вопросов iphone и landscape показывает эти проблемы, которые происходят согласно определенным сценариям:

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

Я потратил существенное количество времени, исследовав эту проблему и наконец нашел решение, которое не является только частичным решением, но и должно работать при всех этих обстоятельствах. Это - мой намеревающееся с этим сообщением CW обеспечить вид FAQ для других, имеющих проблемы с UIViewControllers в Альбомном режиме.

Обеспечьте обратную связь, и справка улучшают качество этого Сообщения путем слияния любых связанных наблюдений. Не стесняйтесь редактировать и отправлять другие/лучше ответы, если Вы знаете о ком-либо.

18
задан 3 revs, 2 users 66% 23 May 2017 в 12:31
поделиться

1 ответ

Что в документации:

В вашем контроллере представления переопределите 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_).

Я скоро добавлю пример кода, сейчас уже поздно. Пожалуйста, дайте мне знать, если остались нерешенные вопросы или что-то непонятно в этом сообщении. Не стесняйтесь редактировать и улучшать.

13
ответ дан 30 November 2019 в 08:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: