Отображение ландшафта UIViewController на портрете UITabBarController / UINavigationController - PullRequest
4 голосов
/ 07 октября 2009

Я понимаю, что этот вопрос (или его разновидности) задавался довольно много раз, но все равно, как лучше всего подойти к этой проблеме, не углубляясь в грязные хаки.

У меня есть приложение со следующим макетом:

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 для ландшафта, которые я могу использовать в качестве основы для разметки подпредставлений.

Ответы [ 2 ]

1 голос
/ 09 октября 2009

Nathan,

Мне кажется, что вы установили PortraitViewController как rootViewController для UINavigationController. Я также считаю, что вы ограничиваете ориентацию PortraitViewController только для UIInterfaceOrientationPortrait только в методе shouldAutorotateToInterfaceOrientation. Если это так, то любой контроллер представления, который вы нажимаете, будет иметь ориентацию самого rootViewController, если вы не изменяете ориентацию устройства, поворачивая ваше устройство.

Так что, если вам нужен LandscapeViewController в ориентации UIInterfaceOrientationLandscapeRight, просто разрешите это в методе shouldAutorotateToInterfaceOrientation: и не путайте вещи, явно задав ориентацию устройства.

0 голосов
/ 09 октября 2009

LandscapeViewController не вращается автоматически, потому что interfaceOrientation равно UIInterfaceOrientationLandscapeRight, поэтому вы должны вернуть YES для UIInterfaceOrientationLandscapeRight

Для правильного изменения размеров ваших представлений вы должны открыть свой xib-файл с помощью Interface Builder, затем в Инспекторе и, наконец, на вкладке «Размер».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...