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

2018-12-11  本文已影响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;
}

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

这里再介绍一下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?

上一篇下一篇

猜你喜欢

热点阅读