11

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

我有一些使用场景,如下所示:

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

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

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

4

4 回答 4

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
于 2013-04-05T03:04:15.060 回答
2

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

@implementation UINavigationController (Rotate)

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

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

@end
于 2015-06-26T09:32:34.843 回答
2

iOS 9 及以上

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

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

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

于 2017-07-31T12:51:13.977 回答
0

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

如何在 iOS 6 中以编程方式更改设备方向

于 2014-03-06T02:10:36.303 回答