Я понимаю, что этот вопрос (или его разновидности) задавался довольно много раз, но все равно, как лучше всего подойти к этой проблеме, не углубляясь в грязные хаки.
У меня есть приложение со следующим макетом:
UITabBarController
↳ UINavigationController
↳ PortraitViewController
↳ LandscapeViewController
Первый PortraitViewController
имеет rightBarButtonItem
, установленный на UIBarButtonItem
, что вызывает landscapeButtonPressed:
. Этот метод помещает LandscapeViewController
в стек контроллера представления.
В LandscapeViewController
я установил hidesBottomBarWhenPushed
на YES
во время инициализации, так как мне нужна только видимая панель навигации.
Я также звоню setStatusBarOrientation:UIInterfaceOrientationLandscapeRight
на [UIApplication sharedApplication]
в loadView
и viewWillAppear:
, а затем снова устанавливаю на UIInterfaceOrientationPortrait
в viewWillDisappear:
.
В моей реализации shouldAutorotateToInterfaceOrientation:
я возвращаю ДА только для UIInterfaceOrientationLandscapeRight
.
PortraitViewController
выглядит так:
Портрет http://img.skitch.com/20091007-18ur7p3iubkrb1if5cak8wdxkb.png
LandscapeViewController
выглядит так:
Сломанный пейзаж http://img.skitch.com/20091007-f3ki1ga5m4ytkyg3wgwektp86e.png
Как видите, вид вращается неправильно. Если я вызову приватный метод -[UIDevice setOrientation:]
до вызова -[UIApplication setStatusBarOrientation:]
, я смогу заставить панель навигации вращаться правильно, но я бы предпочел не вызывать приватные методы, и, похоже, нет способа получить границы моего основного вида для выкладки подпредставлений. Использование приватного метода приводит к следующему:
Лучший ландшафтный вид http://img.skitch.com/20091007-8ckbx6gpbiateju9qjgew4x3k2.png
Есть идеи, как решить эту проблему?
Моя цель - иметь вид в альбомной ориентации с действительными координатами CGRect для ландшафта, которые я могу использовать в качестве основы для разметки подпредставлений.