对于iOS控制器自动旋转的一些探究
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,也不会有效果.