iOS:弹出视图控制器时更改界面方向

时间:2012-12-28 13:46:33

标签: objective-c ios screen-orientation uiinterfaceorientation

我的应用中的所有视图控制器仅在纵向工作,除了可以是纵向或横向的视图控制器。

我有一些使用场景如下:

  1. 我将两个方向都适用的控制器推送到UITabBarController
  2. 用户更改从portait到landscape的方向
  3. 用户按“后退按钮”
  4. 执行这些操作后,应用程序将保持横向状态,并且不会自动将其更改为纵向。

    我使用supportedInterfaceOrientations控制视图控制器方向(我使用的是iOS 6.0)。我做错了什么?当用户按下后退按钮时应用程序自动将方向更改为允许时,如何才能获得正确的行为?谢谢你的回答!

4 个答案:

答案 0 :(得分:2)

在iOS 6(可能更早)中,如果设备旋转时视图控制器在屏幕外,则不会收到任何通知。当它成为顶视图控制器时,它也不会被发送willAnimateRotationToInterfaceOrientation:duration:

您需要跟踪视图控制器的当前方向,并在viewWillAppear:中检查设备方向。如果它们不同,您可以使用willAnimateRotationToInterfaceOrientation:duration:进行正确设置。

由于您可能会做很多事情,因此您可能希望创建视图控制器继承的通用超类。

典型的解决方案是:

@implementation MyHandlesOffscreenRotationController
{
    BOOL   isShowingPortrait;
}

- (void) viewDidLoad
{
    [super viewDidLoad];

    isShowingPortrait = UIInterfaceOrientationIsPortrait(
                        [[UIApplication sharedApplication] statusBarOrientation]);
}


- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

        BOOL currIsPortrait = UIInterfaceOrientationIsPortrait(
                              [[UIApplication sharedApplication] statusBarOrientation]);

    if ((isShowingPortrait && !currIsPortrait) ||
        (!isShowingPortrait && currIsPortrait)) {
        [self willAnimateRotationToInterfaceOrientation:
                [[UIApplication sharedApplication] statusBarOrientation]
                                              duration:0.0f];
    }
}

@end

答案 1 :(得分:2)

iOS 9及以上

在pop时,只需在 viewWillAppear 方法中编写下面提到的代码。

[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger: UIInterfaceOrientationPortrait]forKey:@"orientation"];

这样,您的视图将以纵向模式显示。

答案 2 :(得分:1)

Just override -(BOOL)shouldAutoRotate and - (NSUInteger)supportedInterfaceOrientations inside a UINavigationController category, then ViewController will force rotate to its supported orientation after pop from other ViewController.

@implementation UINavigationController (Rotate)

- (BOOL)shouldAutorotate
{
    return [self.topViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations];
}

@end

答案 3 :(得分:0)

P.L。在这个主题中有一个很好的解决方案:显示并立即关闭一个空模态视图控制器,它只允许肖像|景观

How to change the device orientation programmatically in iOS 6