Проблема pushViewController с альбомной на портретную

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}

В идеале я хочу, чтобы новый viewController, который я помещаю в стек, изначально запускался в портретной, а не в альбомной ориентации. Как ни странно, даже при реализации этого метода он начинается в ландшафте.

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

Любые идеи и / или помощь будут высоко оценены.


person Sahil    schedule 27.01.2011    source источник


Ответы (3)


Я нашел способ заставить портрет. Это немного взломать, но вот это. В -(void)viewDidLoad viewController, для которого вы хотите принудительно установить портрет, выполните следующие действия:

UIViewController *viewController = [[UIViewController alloc] init];
[self presentModalViewController:viewController animated:NO];
[self dismissModalViewControllerAnimated:NO];
[viewController release];

Это в основном заставляет портрет, представляя контроллер (который по умолчанию поддерживает только портрет).

person Sahil    schedule 18.02.2011
comment
Это помогло мне перейти от портретного режима только к альбомному через pushViewController. Избавляет вас от необходимости вызывать недокументированный частный API [[UIDevice currentDevice] setOrientation:UIDeviceOrientationLandscapeRight] Спасибо! - person MyCSharpCorner; 29.10.2011
comment
хороший лайфхак... пригодился... :) - person Roshit; 10.04.2012

Вам нужно будет модально представить свой новый контроллер представления. Если ваш контроллер представления существует в контроллере навигации, ориентация всех контроллеров представления в стеке навигации подразумевается корневым контроллером представления в стеке. Независимо от того, что ваш корневой контроллер представления в стеке навигации возвращает из shouldAutoRotateToInterfaceOrientation, затем используется для всех контроллеров представления ниже него.

person Kenny Wyland    schedule 28.01.2011
comment
Ах, я вижу, это то, что я предполагал, было дело. Спасибо за разъяснения! - person Sahil; 28.01.2011

Ответ Сахиля выше устарел с iOS 6.0. Тем не менее, следующее, кажется, делает тот же трюк:

UIViewController *viewController = [[UIViewController alloc] init];
[self presentViewController:viewController animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];
[viewController release];
person huehmae    schedule 06.03.2013