zoukankan      html  css  js  c++  java
  • IOS6屏幕自动旋转设置测试

    结论如下:

    1> 如果是在rootViewController中添加了方向控制,则他的子视图都默认继承rootViewController的方向控制

    子视图的解释是:

    1 如果rootviewcontroller是普通的uiviewcontroller,则通过presentViewController方法进来的也都叫做子视图,同时这种方法也受到info.plist的限制,他们是继承关系,也可以覆盖父类设置,但是覆盖范围只能越来越小

     

    2 >如果rootViewController是导航UINavigationController,又有2种情况:

    1通过push,进来的各种子页面,则必需在navigation bar 这个跟上设置旋转,这种可能只能通过category来操作它了,而且各个子页面也继承了父类设置,子页面自己不能单独设定,除非UINavigationController把控制权交给了每个子页面,则子页面可以单独设定,但是和父类的设定也是继承关系,也可以覆盖父类设置,但是覆盖范围只能越来越小

    2 presentViewController进来的各种子页面,则只能自己单独设定了,和UINavigationController设定没有任何继承关系,也没有任何联系

    3 >可以在uiWindow上直接添加子视图,这样的视图不受info.plist限制

     

    测试结果:

    1>plist中,supported interface Orientations中,程序打开默认的方向,与这里面设置的先后顺序无关!和打开时候,设备当时的方向有关

    2> 如果在程序中没有做任何方向设置,则单纯的只在supported interface Orientations设置是对所有页面都生效的

    3>info.plist设置所有方向都支持,然后在rootViewController中设置shouldAutorotate为NO,则根本就不会旋转,而且默认打开方向也是竖屏的,说明这个设置会覆盖info.plist设置

    4>info.plist设置所有方向都支持,然后在rootViewController中设置shouldAutorotate为YES,而且设置

    -(NSUInteger)supportedInterfaceOrientations{

        return UIInterfaceOrientationMaskAllButUpsideDown;

    }

    测试结果:按钮朝上时候,屏幕不再旋转

    3,4说明程序里的设置会覆盖info.plist的设置

    5>设定info.plist只支持横屏(landscape Left,landscape Right),然后在rootViewController中设置shouldAutorotate为YES,而且设置

    -(NSUInteger)supportedInterfaceOrientations{

        return UIInterfaceOrientationMaskAllButUpsideDown;

    }

    这时候发现屏幕只能在横屏模式下工作

    3,4,5三点测试说明,info.plist设置是生效的,如果info.plist旋转方向设置的范围大,则可以在代码中设置更小的范围,如果info.plist设置的范围小,在代码中再扩大范围,也是无效的

    6>在5的基础上,在第一个页面加一个按钮,点击进入第二个页面(SecondPage)

      1.第二个页面什么都不设置,发现第二个页面的旋转,继承了rootViewController的设置,只能横屏

    1. SecondPage设置shouldAutorotate为NO,发现第一个页面可以正常旋转,到第二个页面就不旋转了,说明接下来的设置还是会覆盖rootViewController的设置!
    2. SecondPage设置shouldAutorotate为YES,然后设置
    3. -(NSUInteger)supportedInterfaceOrientations{     return UIInterfaceOrientationMaskLandscapeLeft;}

    发现第一个页面可以正常旋转,到第二个页面只能是left方向

    1. 在4点基础上,设置-(NSUInteger)supportedInterfaceOrientations{     return UIInterfaceOrientationMaskAll;}发现第二个页面只能左右,并不能4个方向都任意旋转

    2,3,4三小点,说明了present的情况下,子页面会继承父页面的设置,同时子页面也可以覆盖父页面的设置,但是覆盖的范围只能是越来越小,不能越来越大

     

    上面测试的是普通的rootViewController,在正常present的情况下,如果是UINavigationController下,用push呢

    开始测试UINavigationController的push情况

    上面测试结果不一样了,发现凡是push进来的页面,包括一开始在appDelegate中初始化的UINavigationController

    第一个controller,类似这样

    [[UINavigationController alloc] initWithRootViewController:firstPage

    在firstPage,和secondPage里设置旋转都是无效的

    说明了IOS6旋转只能在根controller下旋转, UINavigationController这种情况下,根是UINavigationController,不是firstPage!

    因此我们添加UINavigationController的category来来解决旋转设置

    我们添加一个UINavigationController+Rotate文件

    然后在里面设置

    -(BOOL)shouldAutorotate

    {

        return NO;

    }

    发现不旋转了,只有竖屏了,说明生效了

     

    然后我们在info.plist里面设置支持所有方向,然后在UINavigationController+Rotate.m的里面设置

    -(BOOL)shouldAutorotate

    {

        return YES;

    }

    -(NSUInteger)supportedInterfaceOrientations

    {

        return UIInterfaceOrientationMaskLandscape;

    }

    发现只有横屏生效,说明同样的,这个设置覆盖了info.plist设置,并且只能越来越小范围的覆盖

     

    继续修改:

    -(NSUInteger)supportedInterfaceOrientations

    {

        return [self.topViewController supportedInterfaceOrientations];

    }

     

    -(BOOL)shouldAutorotate

    {

        return [self.topViewController shouldAutorotate];

    }

    这样设置,就相当于把设置权给下面的具体子视图了,因为每个子视图可以根据自己的情况,自己设定自己的旋转方向去

     

    如果是UINavigationController下,用present添加子页面呢?

    如果是push情况下,如果UINavigationController+Rotate没把具体控制权给子页面,则子页面设置都是无效的

    但是如果用present添加子页面,则子页面里添加控制权就是生效的,而且不再继承UINavigationController+Rotate的任何设置

     

    结论:

    普通的rootViewController,添加子页面也就是通过present方法添加,这时候生效是这样的

    info.plist---> rootViewController--->subview的设置,他们的设置是继承关系,但可以覆盖,但是覆盖设置的范围只能越来越小

     

    如果rootViewController是UINavigationController,UITabController,则有2种可能

    1 push进来的子页面,这时候设置旋转只能通过UINavigationController的Category来设定,子页面自己设定无效.当然UINavigationController的Category也可以把控制权交给具体的子页面来设定,这种情况也是这样的

    info.plist---> UINavigationController--->subview,他们是继承关系,并且范围只能设定越来越小

    2 present进来的页面,这时候present进来的页面不受UINavigationController设定的控制,也不再存在继承关系,需要自己单独设定是否旋转,以及旋转方向

    另外兼容ios5:

    ios5屏幕旋转比较简单,没有iofo.list的支持和限制,因此ios5下设置info.plist是无效的

    ios5只需要在想旋转的页面,设置一个方法

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    {

    }

    即可,其中可旋转的项有

    UIInterfaceOrientationPortrait//垂直
    UIInterfaceOrientationPortraitUpsideDown//倒转
    UIInterfaceOrientationLandscapeLeft//home左
    UIInterfaceOrientationLandscapeRight//home右

    因此兼容ios5需要在页面上分别进行设置

    欢迎学习IOS的朋友请加ios技术交流群:190956763,共同学习,共同进步!

  • 相关阅读:
    迷你图标集大集合:5000+ 30套免费的图标(不得不下,设计必备)
    Github简介
    Sublime Text 3 文本编辑器
    FusionCharts V3图表导出图片和PDF属性说明(转)
    FusionCharts参数的详细说明和功能特性(转)
    SQL 数据结构操作语句
    SQL Server 2008 各种DateTime的取值范围
    Datagrid数据导出到excel文件的三种方法
    开发环境
    如何利用ThoughtWorks.QRCode 生成二维码
  • 原文地址:https://www.cnblogs.com/seesea125/p/3114199.html
Copyright © 2011-2022 走看看