一般在項目當中我們會設(shè)置app僅支持Portrait(home btn on the botton),并且保證適配所有尺寸的屏幕呕寝。如果進行了屏幕旋轉(zhuǎn)(左右),那多數(shù)是會UI錯亂的。
當一個視頻播放需要全屏?xí)r骇吭,我們可以通過其他app發(fā)現(xiàn)其實它做了屏幕旋轉(zhuǎn)的。
一、為什么說還是做了屏幕旋轉(zhuǎn)
-
視頻內(nèi)容顯示時:(以AVPlayer為例)
- 原比例顯示,導(dǎo)致其余留黑
- 原比例拉伸主儡,導(dǎo)致內(nèi)容裁剪
- 拉伸到邊框,導(dǎo)致內(nèi)容拉伸
如果沒有做屏幕旋轉(zhuǎn)惨缆,首先播放按鈕位置不會有改變糜值,其次全屏顯示會導(dǎo)致上下兩部分留黑(參見WWDC內(nèi)視頻)
二、怎么做屏幕旋轉(zhuǎn)
- 點擊全屏坯墨,屏幕旋轉(zhuǎn)橫屏(欺騙系統(tǒng)臀玄,設(shè)置設(shè)備方向)
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()
當設(shè)置設(shè)備方向時會走此方法
判斷當前設(shè)備方向,跳過無需布局
let duration = UIDevice.current.orientation
-
旋轉(zhuǎn)橫屏后StatusBar是否隱藏(ios9.0橫屏默認隱藏)
- 設(shè)置StatusBarBool
- 調(diào)用setNeedsStatusBarAppearanceUpdate()
-
編寫橫屏布局
- 旋轉(zhuǎn)180:
self.view.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
- 改變播放視圖frame:
CGRect(x: 0, y:0, width:屏幕的高 , height: 屏幕的寬)
- 隱藏其他控件
- 旋轉(zhuǎn)180:
-
編寫豎屏布局
- 旋轉(zhuǎn)回來:
self.view.transform = CGAffineTransform(rotationAngle: CGFloat(0))
- 還原播放視圖frame
- 還原其他控件
- 旋轉(zhuǎn)回來:
全屏返回時的操作
- 獲得當前設(shè)備方向畅蹂,按需操作(
portrait
left
right
)- portrait時
- 返回上級頁面pop or dismiss
- 全屏?xí)r
- 重設(shè)設(shè)備方向
- 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")
注意:
- 界面的顯示方向參照文章:http://www.reibang.com/p/e473749f1c30
- 本處并沒有根據(jù)設(shè)備方向旋轉(zhuǎn),而是統(tǒng)一向右旋轉(zhuǎn)180荣恐。