Как заставить ориентацию экрана в определенных контроллерах представления?

Мое приложение довольно простое: оно запускается с контроллером представления, который содержит представление таблицы (в макете сгруппированного представления) с несколькими параметрами. Когда пользователь нажимает на одну из опций, я нажимаю другой контроллер представления на свой контроллер навигации.

Этот второй контроллер представления просто отображает UIImageView, и пользователь может изменять ориентацию экрана на этом контроллере представления между портретным / альбомным режимами. Это прекрасно работает, и все довольны.

Однако, если пользователь нажимает кнопку «Назад» на моей панели навигации в альбомном режиме, компоновка первого контроллера нарушается. См. Ниже скриншоты до и после:

before
(источник: pessoal.org)
 after
(источник: pessoal .org)

Есть какие-нибудь подсказки о том, как заставить первый контроллер представления (второй снимок экрана в этом сообщении) оставаться в портретной ориентации экрана?


person jpm    schedule 24.11.2008    source источник


Ответы (4)


Похоже, что это невозможно сделать с помощью задокументированных методов.

Я зарегистрировал ошибку по этому поводу: rdar: // 6399924

«Невозможно всегда ограничивать UIViewController одной ориентацией»

Вы можете увидеть это на открытом радаре (вместе со ссылкой на образец кода для воспроизведения проблемы) здесь: http://openradar.appspot.com/radar?id=697

person lfalin    schedule 25.11.2008
comment
Это ответ 2008 года. Теперь у вас есть решение здесь я использовал для блокировки ориентации. - person Martin Berger; 05.10.2012
comment
Как всегда в Stack Overflow, если у вас есть лучшее / более актуальное решение, чем принятое, опубликуйте его соответствующим образом, чтобы мы могли обновить принятый ответ. - person lfalin; 12.08.2013

Как и предложил кто-то на открытом радаре, обходной путь - отключить кнопку «назад» в не-портретном режиме:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    // don't let user press "back" button in landscape - otherwise previous view and the rest of the application
    // will also be in landscape which we did not feel like testing yet
    self.navigationController.navigationBarHidden = (UIInterfaceOrientationPortrait != self.interfaceOrientation);
}
person Community    schedule 10.01.2009

Для этого есть решение: использовать контроллер представления и добавить его представление в окно. затем в этом контроллере вы устанавливаете ландшафт в методе shouldAutorotate ... Он работает нормально, но убедитесь, что это необходимо для вашего проекта, потому что не очень разумно заставлять пользователя поворачивать свой iPhone. Кстати, вот пример кода, если он вам нужен.

http://www.geckogeek.fr/iphone-forcer-le-mode-landscape-ou-portrait-en-cours-dexecution.html

person Vinzius    schedule 12.09.2010

Мне не удалось заставить это работать так, как я хотел. У вас должна быть возможность установить определенную ориентацию для ViewController, но NavigationController, похоже, не всегда поступает правильно.

Я закончил перепроектирование своих экранов так, чтобы все они работали в любой ориентации. Это может быть лишней работой, но в любом случае это «кажется» более естественным.

person Mark Bessey    schedule 24.11.2008