UINavigationController强制旋转

时间:2012-03-22 16:55:04

标签: iphone objective-c ios ios5 uinavigationcontroller

我的应用程序主要是人像,但有一个视图需要横向方向。

我的观点包含在UINavigationController中,显然这是导致此问题的原因。

除了一个之外的所有UIViewControllers都有:

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

需要Landscape的UIViewController具有:

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

现在,当用户到达横向UIViewController时会发生什么,它以纵向显示。然后,用户可以旋转他们的手机,并按照我想要的方式显示在风景中(锁定到风景)。然后用户继续前进到肖像UIViewController,同样的情况发生:它从横向开始,然后他们旋转手机,它再次成为肖像(并锁定到肖像)。

UIViewControllers之间似乎允许方向锁定,但是自动旋转/以编程方式更改方向会以某种方式被阻止。

如何强制手机更新到正确的方向?

有一个临时解决方案:我可以检测设备的方向并显示一条消息,要求他们在设备不正确的情况下旋转设备,但这不是最佳的。

3 个答案:

答案 0 :(得分:26)

我对我的一个申请有同样的要求!!!

幸运的是,我找到了解决方案!

为了保持主视图控制器的格局,无论从哪个方向弹出/推动,我都做了以下事情:(在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.Tested on 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.

希望它会有所帮助!

答案 1 :(得分:19)

这可能会有所帮助。在适当的情况下,您可以在出现时调用以下方法。例如在-viewWillAppear:animated

<强> attemptRotationToDeviceOrientation 尝试将所有窗口旋转到设备的方向。

+ (void)attemptRotationToDeviceOrientation

讨论

  

某些视图控制器可能希望使用特定于应用程序的条件   确定其执行的返回值   shouldAutorotateToInterfaceOrientation:方法。如果你的观点   控制器这样做,当这些条件改变时,你的应用程序应该   调用这个类方法。系统立即尝试旋转到   新方向。只要每个相关视图发生旋转   控制器在其实现中返回YES   shouldAutorotateToInterfaceOrientation:方法。

状况

适用于iOS 5.0及更高版本。 http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html

答案 2 :(得分:4)

使用此,

[[UIDevice currentDevice]performSelector:@selector(setOrientation:) withObject:(__bridge id)((void *)UIInterfaceOrientationLandscapeRight)];