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的设置,只能横屏
- SecondPage设置shouldAutorotate为NO,发现第一个页面可以正常旋转,到第二个页面就不旋转了,说明接下来的设置还是会覆盖rootViewController的设置!
- SecondPage设置shouldAutorotate为YES,然后设置
- -(NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscapeLeft;}
发现第一个页面可以正常旋转,到第二个页面只能是left方向
- 在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,共同学习,共同进步!