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,共同学习,共同进步!

posted @ 2013-06-02 19:29  赵学智  阅读(5484)  评论(3编辑  收藏  举报