美文网首页
对于iOS控制器自动旋转的一些探究

对于iOS控制器自动旋转的一些探究

作者: _未可知 | 来源:发表于2018-12-11 18:25 被阅读0次

    iOS在开发App的时候,我们往往会有这样的需求,在某些控制器里需要支持自动旋转(比如播放器),有的控制器不需要自动旋转,这里对自动旋转的方式做了一些探究。

    旋转的方式

    一般设置旋转有两种方法:
    方法一:


    Universal iPad iPhone

    这里注意一下,device iPhone和iPad是不同的哦,iPad默认4个方向,iPhone默认3个方向(倒放最好不要用,iPhone X等系列不适配),需要哪种方向直接在这里设置就好;
    方法二:

    - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    {
        return UIInterfaceOrientationMaskAll;
    }
    

    需要注意的是这个方法会覆盖deployment info 里面的设置。

    现在我们需要对各个控制器进行精准的控制,我们需要重写topmost视图控制器的三个方法

    - (BOOL)shouldAutorotate
    {
        return NO;
    }
    
    -(UIInterfaceOrientationMask)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskAll;
    }
    
    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return UIInterfaceOrientationPortrait;
    }
    

    先来介绍一下这三个方法:

    • (BOOL)shouldAutorotate 顾名思义,它的意思就是返回是否支持自动旋转。
    • (UIInterfaceOrientationMask)supportedInterfaceOrientations 该控制器支持的旋转的方向(如果重写了-application:supportedInterfaceOrientationsForWindow:这里的支持的方向必须是-application:supportedInterfaceOrientationsForWindow:返回值的子集,如果是在Deployment info 里面设置的,则应为Deployment info 的orientation的子集)
    • (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 这个方法的意思是当你present一个视图控制器,当前的控制器支持不止一个方向,你可以在这里返回显示效果最好的方向,当控制器刚被present出来,显示的方向就是这个方向,只对present的控制器有效果.

    这里再介绍一下topmost视图控制器这个概念:window的rootViewController控制器就是一个topmost视图控制器,如果此时你present出一个其他的控制器,present出来的控制器就是新的topmost视图控制器,如果我们在非topmost控制器里重写这三个方法是不起作用的(iOS的文档里说的是
    however, a view controller may dynamically disable automatic rotation at runtime by overriding shouldAutorotate to return NO;
    但是我在实际使用中,并没有效果
    )。如果你想指定某个控制器是否支持自动旋转,可以在topmost控制器里通过topViewController、childViewControllers等属性找到该控制器(一般App的rootViewController基本都是是UINavigationController、UITabViewController),并设置它的旋转方式。
    对于通过重写- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window方式控制的话,也可以通过topViewController、childViewControllers等属性找到该控制器,然后在返回正确的方向即可。这个方法返回的方向会覆盖 (UIInterfaceOrientationMask)supportedInterfaceOrientations 返回的方向,但是还是会遵守topmost视图控制器的- (BOOL)shouldAutorotate返回的值。
    如果 -application:supportedInterfaceOrientationsForWindow: 只返回了一个方向,topmost视图控制器 - (BOOL)shouldAutorotate返回YES,也不会有效果.

    Why won't my UIViewController rotate with the device?

    相关文章

      网友评论

          本文标题:对于iOS控制器自动旋转的一些探究

          本文链接:https://www.haomeiwen.com/subject/cwsehqtx.html