一般在项目当中我们会设置app仅支持Portrait(home btn on the botton),并且保证适配所有尺寸的屏幕。如果进行了屏幕旋转(左右),那多数是会UI错乱的。
当一个视频播放需要全屏时,我们可以通过其他app发现其实它做了屏幕旋转的。
一、为什么说还是做了屏幕旋转
-
视频内容显示时:(以AVPlayer为例)
- 原比例显示,导致其余留黑
- 原比例拉伸,导致内容裁剪
- 拉伸到边框,导致内容拉伸
如果没有做屏幕旋转,首先播放按钮位置不会有改变,其次全屏显示会导致上下两部分留黑(参见WWDC内视频)
二、怎么做屏幕旋转
- 点击全屏,屏幕旋转横屏(欺骗系统,设置设备方向)
let unknown = UIInterfaceOrientation.unknown.rawValue as NSNumber
UIDevice.current.setValue(unknown, forKey: "orientation")
let left = UIInterfaceOrientation.landscapeRight.rawValue as NSNumber
UIDevice.current.setValue(left, forKey: "orientation")
-
重写viewDidLayoutSubviews()
当设置设备方向时会走此方法
判断当前设备方向,跳过无需布局
let duration = UIDevice.current.orientation
-
旋转横屏后StatusBar是否隐藏(ios9.0横屏默认隐藏)
- 设置StatusBarBool
- 调用setNeedsStatusBarAppearanceUpdate()
-
编写横屏布局
- 旋转180:
self.view.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
- 改变播放视图frame:
CGRect(x: 0, y:0, width:屏幕的高 , height: 屏幕的宽)
- 隐藏其他控件
- 旋转180:
-
编写竖屏布局
- 旋转回来:
self.view.transform = CGAffineTransform(rotationAngle: CGFloat(0))
- 还原播放视图frame
- 还原其他控件
- 旋转回来:
全屏返回时的操作
- 获得当前设备方向,按需操作(
portrait
left
right
)- portrait时
- 返回上级页面pop or dismiss
- 全屏时
- 重设设备方向
- portrait时
let unknown = UIInterfaceOrientation.unknown.rawValue as NSNumber
UIDevice.current.setValue(unknown, forKey: "orientation")
let por = UIInterfaceOrientation.portrait.rawValue as NSNumber
UIDevice.current.setValue(por, forKey: "orientation")
注意:
- 界面的显示方向参照文章://www.greatytc.com/p/e473749f1c30
- 本处并没有根据设备方向旋转,而是统一向右旋转180。