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