项目中有个页面需要强制横屏,代码逻辑实现如下。
首先,创建一个UINavigationController的子类CustomNavigationController,重载
shouldAutorotate,
supportedInterfaceOrientations,
preferredInterfaceOrientationForPresentation 三个方法
/**
*
* @return 是否支持旋转
*/
override var shouldAutorotate : Bool {
return viewControllers.last!.shouldAutorotate
}
/**
* 适配旋转的类型
*
* @return 类型
*/
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
return viewControllers.last!.supportedInterfaceOrientations
}
override var preferredInterfaceOrientationForPresentation : UIInterfaceOrientation {
return viewControllers.last!.preferredInterfaceOrientationForPresentation
}
然后,在AppDelegate中设置rootViewController
func setTheRootViewController() {
let mainTabBarController = UIStoryboard(name: "Home", bundle: nil).instantiateViewController(withIdentifier: "mainTabBarController") as! MainTabBarController
let navigationController = CustomNavigationViewController(rootViewController: mainTabBarController)
navigationController.navigationBar.isTranslucent = false
window?.rootViewController = navigationController
}
之后,在基类BaseViewController里设置(假如没有基类,A 推到 B,在A里面写)
override var shouldAutorotate : Bool {
return false
}
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.portrait
}
override var preferredInterfaceOrientationForPresentation : UIInterfaceOrientation {
return UIInterfaceOrientation.portrait
}
最后,在将要横屏的页面假如如下代码
override var shouldAutorotate : Bool {
return true
}
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.landscapeRight
}
override var preferredInterfaceOrientationForPresentation : UIInterfaceOrientation {
return UIInterfaceOrientation.landscapeRight
}
但是,在测试过程中,发现iPhone 6s Plus 在桌面状态支持横屏了,那么就引起了横屏启动的问题。按上面代码实现之后,横屏启动时候界面是不转为横屏了,但是因为设备的 width 和 height 变了,所以整个界面的的width和height也跟着变了,但是方向没变,界面就乱了。
我的window.rootViewController 是 NavigationController, 然后在
AppDelegate的didFinishLaunchingWithOptions launchOptions:里这样写
application.statusBarOrientation = .portrait
CustomNavigationController里面也需要添加
UIApplication.shared.setStatusBarOrientation(.portrait, animated: false)
然后在需要横屏的页面里面
UIApplication.shared.setStatusBarOrientation(.landscapeRight, animated: false)
这样才实现了最终效果。而且进入横屏页面然后再推出原界面也不会出现横屏的问题。
因为一直都是用的swift开发,所以上面都是swift语法,OC只要自己转一下即可。