
这种情况的APP可以说是非常少了,不过还是对后面的情况有所帮助。
设置BaseVC,在其中的配置锁定竖屏:
class BaseVC: UIViewController {
override var shouldAutorotate: Bool {
return false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return .portrait
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
然后其余控制器继承BaseVC,需要旋转的控制器单独再次重写方法。
3.2.2 根控制器为UINavigationController
对应Demo配置:

我们可以获取到当前显示层级的控制器,并拿出它的属性赋给UINavigationController
class BaseNavC: UINavigationController {
override var shouldAutorotate: Bool {
return self.viewControllers.last?.shouldAutorotate ?? false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return self.viewControllers.last?.supportedInterfaceOrientations ?? .portrait
}
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return self.viewControllers.last?.preferredInterfaceOrientationForPresentation ?? .portrait
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
3.2.3 根控制器为UITabBarController
对应Demo配置:

class BaseTabBarC: UITabBarController {
override var shouldAutorotate: Bool {
return self.selectedViewController?.shouldAutorotate ?? false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return self.selectedViewController?.supportedInterfaceOrientations ?? .portrait
}
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return self.selectedViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
同理,我们只需要获取当前选中的控制器的配置赋给UITabBarController,这样一层一层就配置好了!
3.3 最简单的实现方式
对应Demo配置:

在查询屏幕旋转相关资料的时候我发现屏幕旋转时会最后调用Appdelegate中的:










