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

Dan*_*pov 10 objective-c screen-orientation uiinterfaceorientation ios

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

我有一些使用场景如下:

  1. 我将两个方向都适用的控制器推送到UITabBarController
  2. 用户从portait到landscape的方向更改
  3. 用户按"后退按钮"

执行这些操作后,应用程序将保持横向方向,并且不会自动将其更改为纵向.

我使用supportedInterfaceOrientations控制视图控制器方向(我使用的是iOS 6.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
Run Code Online (Sandbox Code Playgroud)