iOS - UISupportedInterfaceOrientations和shouldAutorotateToInterfaceOrientation

时间:2012-11-30 13:22:53

标签: ios xcode cocoa-touch orientation

我正在寻找有关如何仅为您的iOS应用程序仅允许某些方向的一些说明。我知道UISupportedInterfaceOrientationsshouldAutorotateToInterfaceOrientation,但我对它们的用途以及它们如何组合起来有点困惑。

我尝试使用UISupportedInterfaceOrientations仅允许横向方向,直到我研究它并且读到它影响初始方向时,它似乎没有任何影响。测试完成后,我的应用程序看起来只是在横向打开,但如果屏幕是纵向的话,会快速旋转。

我知道您可以使用shouldAutorotateToInterfaceOrientation来限制允许的方向,例如:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || 
           (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

然而,在网上阅读时我读到shouldAutorotateToInterfaceOrientation从iOS6开始不推荐使用。

基本上我的问题是:

  1. 限制屏幕方向的正确方法是什么? 多个版本的iOS?
  2. 唯一使用UISupportedInterfaceOrientations来限制。{ 初步定位?
  3. 修改

    要扩展已接受的答案,shouldAutorotate适用于iOS6。如果您已经在shouldAutorotateToInterfaceOrientation中实现了逻辑并且/或者您想要支持早期版本的iOS,那么快速修复,您可以执行以下操作:

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
        return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || 
               (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
    }
    
    - (BOOL)shouldAutorotate {
        return [self shouldAutorotateToInterfaceOrientation:self.interfaceOrientation];
    }
    

2 个答案:

答案 0 :(得分:3)

您需要用于轮换而不是shouldAutorotateToInterfaceOrientation的方法只是shouldAutorotate

根据AppleDoc for ViewControllers处理旋转:

  

在iOS 6中,您的应用支持应用的Info.plist文件中定义的界面方向。视图控制器可以覆盖supportedInterfaceOrientations方法以限制支持的方向列表。通常,系统仅在窗口的根视图控制器或呈现的视图控制器上调用此方法以填充整个屏幕;子视图控制器使用由父视图控制器为其提供的窗口部分,不再直接参与有关支持哪些旋转的决策。应用程序的方向遮罩和视图控制器的方向遮罩的交点用于确定视图控制器可以旋转到哪个方向。

     

您可以覆盖打算以特定方向全屏显示的视图控制器的preferredInterfaceOrientationForPresentation。

不推荐使用方法shouldAutorotateToInterfaceOrientation,以及处理设备轮换响应的一些方法。

对于iOS的多个版本的支持方法,这是Apple所说的其他内容:

  

为了兼容性,仍然实现shouldAutorotateToInterfaceOrientation:方法的视图控制器不会获得新的自动旋转行为。 (换句话说,它们不会回退到使用app,app delegate或Info.plist文件来确定支持的方向。)而是使用shouldAutorotateToInterfaceOrientation:方法来合成将由supportedInterfaceOrientations方法返回的信息。

取自release notes

答案 1 :(得分:0)

回答你的第二个问题:

是的,Info.plist中的“UISupportedInterfaceOrientations”条目仅用于应用的初始启动,确保它不会以不支持的方向启动您的应用,因此不需要执行马上轮换。

此外,如果您的应用永远不想使用特定方向(例如,仅用于横向的游戏),则在您的AppDelegate中覆盖“application:supportedInterfaceOrientationsForWindow”非常有用。

最后,这是一个常见的错误,在iPhone和iPod Touch设备上,设备永远不会旋转到UIInterfaceOrientationPortraitUpsideDown!这是因为这些设备(与iPad相反)不允许用户使用 Lock 软键在横向模式下锁定设备 - 该按钮仅锁定为纵向。因此,如果放在他身边的用户想要在横向模式下使用应用程序,则如果您的应用程序进入倒置方向,则他无法执行此操作。但如果你不允许这种轮换,那么它就可以了。