UINavigationController Force Rotate - PullRequest
       2

UINavigationController Force Rotate

18 голосов
/ 22 марта 2012

Мое приложение в основном портретное, однако есть один вид, который требует альбомной ориентации.

Мои представления содержатся в UINavigationController, который (по-видимому) является причиной этой проблемы.

Все контроллеры UIView, кроме одного, имеют это:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

Контроллер UIViewController, который требует Landscape, имеет следующее:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

Теперь, когда пользователь достигает ландшафта UIViewController, он отображается в портретной ориентации. Затем пользователь может повернуть свой телефон, и он будет отображаться в альбомной ориентации, как я хочу (блокировка в альбомной ориентации). Затем пользователь переходит к портретному UIViewController, и происходит то же самое: он запускается в альбомной ориентации, затем он поворачивает свой телефон, и он снова становится портретным (и привязывается к портретному).

Кажется, что блокировка ориентации разрешена между UIViewControllers, однако автоматическое вращение / изменение ориентации программным способом каким-то образом блокируется.

Как заставить телефон обновиться до правильной ориентации?

Существует временное решение: я могу определить ориентацию устройства и показать сообщение с просьбой повернуть устройство, если оно неверно, однако это не оптимально.

Ответы [ 3 ]

26 голосов
/ 13 апреля 2012

У меня было такое же требование для одного из моих приложений !!!

К счастью, я нашел решение!

Чтобы сохранить ландшафт основного view-контроллера, независимо от того, с какой ориентации он был вытолкнут / нажат, я сделал следующее: (в viewWillAppear:)

//set statusbar to the desired rotation position
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];

//present/dismiss viewcontroller in order to activate rotating.
UIViewController *mVC = [[[UIViewController alloc] init] autorelease];
[self presentModalViewController:mVC animated:NO];
[self dismissModalViewControllerAnimated:NO];

P.S. Проверено на SDK 3.2.5 IOS 5.0.1.

P.S. В iOS 8 предыдущий ответ приводит к некоторому мерцанию экрана, а также - он нестабилен (в некоторых случаях он больше не работает для меня). Поэтому для своих нужд я изменил код на: (ARC)

//set statusbar to the desired rotation position
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];

[self.navigationController presentViewController:[UIViewController new] animated:NO completion:^{
    dispatch_after(0, dispatch_get_main_queue(), ^{
        [self.navigationController dismissViewControllerAnimated:NO completion:nil];
    });
}];

//I added this code in viewDidDissapear on viewController class, which will be popped back.

Надеюсь, это поможет!

19 голосов
/ 22 марта 2012

Это может помочь. Вы можете вызвать следующий метод при появлении, где это уместно. например в -viewWillAppear:animated

attemptRotationToDeviceOrientation Попытки повернуть все окна в направлении устройства.

+ (void)attemptRotationToDeviceOrientation

Обсуждение

Некоторые контроллеры представления могут захотеть использовать специфичные для приложения условия для определить возвращаемое значение их реализации shouldAutorotateToInterfaceOrientation: метод. Если ваш взгляд контроллер делает это, когда эти условия меняются, ваше приложение должно вызовите этот метод класса. Система немедленно пытается повернуть к новая ориентация. Вращение происходит до тех пор, пока каждый соответствующий вид контроллер возвращает ДА ​​в своей реализации shouldAutorotateToInterfaceOrientation: метод.

Наличие

Доступно в iOS 5.0 и более поздних версиях. http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html

4 голосов
/ 23 июня 2015

Используйте это,

[[UIDevice currentDevice]performSelector:@selector(setOrientation:) withObject:(__bridge id)((void *)UIInterfaceOrientationLandscapeRight)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...