Этот вопрос касается вращения устройства iOS и нескольких контролируемых представлений в UINavigationController. Некоторые взгляды должны быть ограничены ориентацией на портрет, а некоторые должны автоматически открываться. Если вы попытаетесь создать простейшую настройку с тремя видами, вы заметите, что поведение авторотации имеет несколько очень неприятных причуд. Сценарий, однако, очень прост, поэтому я думаю, что я либо не выполняю реализацию авторотации правильно, либо забываю что-то.
У меня есть очень базовое демонстрационное приложение, которое показывает странность, и я сделал видео, показывающее его в действии.
- Загрузить приложение (проект XCode)
- Просмотр классов как сущности (довольно длительный)
- Посмотрите видео с вопросом (YouTube, 2m43s)
Настройка очень простая: три контроллера вида, называемые FirstViewController
, SecondViewController
и ThirdViewController
, расширяют AbstractViewController
, который показывает метку с именем класса и возвращает YES для shouldAutorotateToInterfaceOrientation:
, когда устройство находится в портретной ориентации. SecondViewController переопределяет этот метод, чтобы разрешить все вращения. Все три конкретных класса добавляют несколько цветных квадратов, чтобы можно было перемещаться между представлениями, нажимая и выталкивая контроллеры в положение UINavigationController
. Я бы сказал, что это очень простой сценарий.
Если вы держите устройство в портретной или альбомной ориентации, это результат, который я бы не только хотел достичь, но и ожидал. На первом изображении вы видите, что все представления являются "вертикальными", а во втором вы видите, что только второй контроллер просмотра вращает ориентацию устройства. Чтобы быть ясным, должно быть возможно перемещаться со второго представления в ландшафтном режиме на третье, но поскольку эта третья только поддерживает портретную ориентацию, ее следует показывать только в портретной ориентации. Самый простой способ убедиться, что результаты в порядке, - это посмотреть на позицию несущей.
Но этот вопрос здесь, потому что фактический результат совершенно другой. В зависимости от того, с каким видом вы находитесь, когда вы вращаете устройство, и в зависимости от того, какой вид вы переходите к следующему, представления не будут вращаться (чтобы быть конкретным, метод didOrientFromInterfaceOrientation:
никогда не вызывается). Если вы находитесь в ландшафте на втором и переходите к третьему, он будет иметь ту же ориентацию, что и второй (= плохой). Однако, если вы переходите со второго назад на первое, экран будет вращаться в режиме принудительного портрета, а панель оператора будет находиться на физическом верхнем углу устройства, независимо от того, как вы держите его. Видео показывает это более подробно.
Мой вопрос двоякий:
- Почему первый контроллер просмотра вращается назад, но не третий?
- Что нужно сделать, чтобы получить правильное поведение из ваших представлений, когда вы хотите, чтобы некоторые виды автоматически открывались, но не другие?
Cheers, ЕР.
РЕДАКТИРОВАТЬ: В качестве крайней меры, прежде чем положить на нее щедрость, я полностью переписал этот вопрос, чтобы быть короче, яснее и, надеюсь, более привлекательным, чтобы дать ответ.