【问题标题】:iOS: Change interface orientation when pop view controlleriOS:弹出视图控制器时更改界面方向
【发布时间】:2012-12-13 18:38:42
【问题描述】:

我的应用程序中的所有视图控制器都只能纵向工作,但可以纵向或横向的视图控制器除外。

我有一些使用场景如下:

  1. 我将双向工作的控制器推送到 UITabBarController
  2. 用户将方向从纵向更改为横向
  3. 用户按下“返回按钮”

在这些操作之后,应用程序保持横向并且不会自动将其更改为纵向。

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

【问题讨论】:

标签: objective-c ios screen-orientation uiinterfaceorientation


【解决方案1】:

在 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

【讨论】:

  • 这是一个不错的答案,除了您必须在旋转后设置isShowingPortrait,因此它已更新。否则它只会工作一次。 (也适用于 ios7)
【解决方案2】:

只需在 UINavigationController 类别中覆盖 -(BOOL)shouldAutoRotate and - (NSUInteger)supportedInterfaceOrientations,然后 ViewController 将在从其他 ViewController 弹出后强制旋转到其支持的方向。

@implementation UINavigationController (Rotate)

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

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

@end

【讨论】:

    【解决方案3】:

    iOS 9 及更高版本

    在弹出的时候,只需在你的 viewWillAppear 方法中编写下面提到的代码。

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

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

    【讨论】:

      【解决方案4】:

      P.L.在这个主题上有一个很好的解决方案:展示并立即关闭一个只允许纵向的空模式视图控制器 |风景

      How to change the device orientation programmatically in iOS 6

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多