supportInterfaceOrientations更改时如何通知系统?

时间:2012-10-31 01:47:27

标签: ios uiviewcontroller rotation uikit

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

如果用户旋转设备,则此功能正常。但是,如果设备处于纵向模式,则不会调用supportedInterfaceOrientations方法,除非用户手动旋转设备。

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

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

我找到了其他人发布的各种解决方法来尝试解决这个问题,但是我的测试中没有一个可以解决。我怀疑他们可能在iOS 5.0中工作,但不是iOS 6.0。

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

3 个答案:

答案 0 :(得分: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调用shouldAutorotatesupportedInterfaceOrientations方法。

答案 1 :(得分:0)

引用Apple的UIViewController类参考:

  

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

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

如果界面以纵向方式开始,即使用户打开设备旁边的设备,自动旋转也应该能够处理调整。

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

How to force a UIViewController to Portrait orientation in iOS 6

答案 2 :(得分: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;
}

只要它出现,它就应该旋转特定视图控制器的视图。