iOS开发中应用的横竖屏在项目中就可以设置App支持的旋转方向,这是全局控制的一种方法,代码的实现是以下三个方法:
- (BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;
当shouldAutorotate返回YES的时候,第二个函数才有效。如果返回NO,则无论项目如何设置,ViewController都只会使用preferredInterfaceOrientationForPresentation的返回值来初始化自己的方向,如果没有重新定义这个函数,那么返回父视图控制器的preferredInterfaceOrientationForPresentation的值。
公司最近的需求是实现指定的单个界面禁止横屏,而不影响其他界面,毕竟大多数界面还是要求可以实现横竖屏的,所以在Targets中设置允许竖屏和横屏,只对指定的界面做处理
用上面写的三个方法的时候要注意:
在controller中只有以下两种情况:
当前controller是window的rootViewController
当前controller是modal模式的时,orientations相关方法才会起作用(才会被调用),当前controller及其所有的childViewController都在此作用范围内。
所以想改变某个控制器的横竖屏状态前要先考虑清楚它的父控件,找到window的rootViewController,在里面实现方法
似乎在根控制器里实现这些方法的效果和全局控制一样,如何在指定的单个控制器中实现?这里的做法是在根控制器和指定子控制器中都添加此方法,只是在根控制的方法里添加判断当前界面展示的控制器是否也包含这个同名的方法,如果包含,返回当前控制器想要的效果,不包含则返回默认效果
具体实现:
这里只用了其中的两个方法,项目中的根控制器是一个NavgationController,所以自定义UINavgationController的子类,在子类里写入以下方法:
//
override func shouldAutorotate() -> Bool {
if ((self.topViewController?.respondsToSelector(#selector(shouldAutorotate))) == true) {
// print("========================\\\\\\\\\\\\\\\\(self.topViewController)-----------------------")
return (self.topViewController?.shouldAutorotate())!
}
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if ((self.topViewController?.respondsToSelector(#selector(supportedInterfaceOrientations))) == true) {
return (self.topViewController?.supportedInterfaceOrientations())!
}
return UIInterfaceOrientationMask.All
}
在需要改变状态的单个控制器的类里也添加相同方法(只是不需要判断了)
override func shouldAutorotate() -> Bool {
return false
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.Portrait
}
通过以上代码在对应控制器中的调用就可以实现指定界面的横竖屏状态控制