15

我的根视图控制器的实现supportedInterfaceOrientations几乎总是返回UIInterfaceOrientationMaskAll,但是有一种极端情况会返回UIInterfaceOrientationMaskLandscape

如果用户旋转设备,这是可行的。但是,如果设备以纵向模式保持,supportedInterfaceOrientations则不会调用该方法,除非用户手动旋转设备。

如何以编程方式告诉系统此方法的返回值已更改?

根据文档,似乎我应该可以调用[UIViewController attemptRotationToDeviceOrientation]但是这没有任何效果(supportedInterfaceOrientations从不调用并且屏幕不旋转)。

我发现了其他人发布的各种解决方法来尝试解决这个问题,但在我的测试中它们都不起作用。我怀疑他们可能在 iOS 5.0 中工作过,但在 iOS 6.0 中没有。

我正在返回YES根视图控制器的shouldAutorotate方法。

4

3 回答 3

1

首先,如果你想在横向模式下展示你的 UIViewController,它可能会很有用。

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}

此外,很大程度上取决于您的 UIViewController 嵌入到哪个控制器中。

例如,如果它在 UINavigationController 中,那么您可能需要继承该 UINavigationController 以覆盖这样的方向方法。

子类 UINavigationController(层次结构的顶部视图控制器将控制方向。)需要将其设置为 self.window.rootViewController。

- (BOOL)shouldAutorotate
 {
     return self.topViewController.shouldAutorotate;
 }
 - (NSUInteger)supportedInterfaceOrientations
 {
     return self.topViewController.supportedInterfaceOrientations;
 }

从 iOS 6 开始,UINavigationController 不会向其 UIVIewControllers 请求方向支持。因此我们需要对它进行子类化。

笔记 :

每当 Push 操作完成时,总是会为 UINavigationController 调用shouldAutorotateand方法。supportedInterfaceOrientations

于 2012-11-05T06:28:24.360 回答
0

引用 Apple 的 UIViewController 类参考:

注意:在启动时,应用程序应始终将其界面设置为纵向。在 application:didFinishLaunchingWithOptions: 方法返回后,应用程序使用上述视图控制器旋转机制在显示窗口之前将视图旋转到适当的方向。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

如果界面以纵向开始,则即使用户在设备侧放的情况下打开应用程序,自动旋转也应该能够处理调整。

更新:我发现这篇文章应该有助于启动后的轮换。显然,iOS 6 会查看导航控制器以确定支持的设备方向。

如何在 iOS 6 中强制 UIViewController 为纵向

于 2012-10-31T03:16:22.163 回答
0

您需要手动旋转它。您需要在视图控制器的viewWillAppear:方法中调用以下逻辑:

UIDeviceOrientation curDevOrientation = [[UIDevice currentDevice] orientation];
if (![self supportsOrientation:curDevOrientation]) {
    // We're going to rotate 90 degrees clockwise.  First figure out what that
    // means to the status bar.
    UIInterfaceOrientation newStatusBarOrientation;
    switch (curDevOrientation)  {
        case UIDeviceOrientationPortrait:
            newStatusBarOrientation = UIInterfaceOrientationLandscapeRight;
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            newStatusBarOrientation = UIInterfaceOrientationLandscapeLeft;
            break;
    }
    [[UIApplication sharedApplication] setStatusBarOrientation:newStatusBarOrientation animated:NO];

    // Now rotate the view 90 degrees clockwise.
    CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI * 90.0 / 180.0);
    self.view.transform = transform;
}

这应该旋转特定视图控制器的视图,无论何时出现。

于 2012-11-12T03:32:51.770 回答