最近遇到视频的需求,里面有全屏,因此研究了一下全屏的问题,
需求
- 进界面的时候是竖屏
- 进入 播放界面是竖屏
- 播放界面中可以自动翻转
解决方案
其中纠结的部分就不提了,直接说解决方案吧
需求1
需求1的重点在于,让app支持横屏,但是进入界面的时候是竖屏
首先,通过设置TARGETS - General - Deployment info - Device orientation 的选项为第一个
然后在AppDelegate中添加一下代理
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
//设置app支持的屏幕模式
return [.portrait, .landscapeLeft, .landscapeRight]
}
需求2
其实就是出了播放页面外,所有页面都是竖屏
viewController 有以下几个属性可供重写,通过重写这几个方法,来实现界面的横屏或竖屏
@available(iOS 6.0, *) //屏幕自动翻转
open var shouldAutorotate: Bool { get }
@available(iOS 6.0, *) // 当前界面支持的屏幕方向
open var supportedInterfaceOrientations: UIInterfaceOrientationMask { get }
// Returns interface orientation masks.
@available(iOS 6.0, *) //初始屏幕方向,--但是实际上看意义不大
open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { get }
经过查坑发现,VC里面重写的方法并不是都能调用,因为被NavigationController和TabbarController给拦截了,需要在NavigationController和TabbarController中添加一下方法
如果没有用到nav或者tab,就不用重写了
-
ViewController中
override var shouldAutorotate: Bool { return true } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return [.portrait, .landscapeRight, .landscapeLeft] } override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { return .landscapeLeft }
-
NavigationController中
override var shouldAutorotate: Bool { if let top = topViewController { return top.shouldAutorotate } return false } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { if let top = topViewController { return top.supportedInterfaceOrientations } return .portrait } override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { //测试着不怎么管用,不知道为什么, if let top = topViewController { return top.preferredInterfaceOrientationForPresentation } return .portrait }
-
TabbarController
open override var shouldAutorotate: Bool { if let vc = selectedViewController { return vc.shouldAutorotate } return false } open override var supportedInterfaceOrientations: UIInterfaceOrientationMask { if let vc = selectedViewController { return vc.supportedInterfaceOrientations } return .portrait }
通过重写nav和tab里面的方法,调用VC里面重写的方法。
需求3
其实上面就已经实现了需求3的基本效果,如果再多说点,就是得加个屏幕翻转的监听,来实现刷新界面之类的操作了--!废话不多说,关门放代码:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(onDeviceOrientationChange), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
func onDeviceOrientationChange() {
//界面方向发生变化
let orientation = UIDevice.current.orientation
let interfaceOrientation = UIInterfaceOrientation(rawValue: orientation.rawValue)
//该去做什么就去做什么吧
}
网友评论