原文:http://www.reibang.com/p/e2bbc312aac2
一 . 需求
APP中需要支持橫屏和豎屏锌半,并在不同的頁面 可支持的屏幕旋轉(zhuǎn)方向不一致
整體豎屏,部分強制橫屏
-
整體橫屏掸绞,部分強制豎屏
如下:image
二. 實現(xiàn)
不廢話,直接上代碼
1. 代碼層
1)AppDelegate.swift
文件添加對屏幕旋轉(zhuǎn)的支持
添加屬性:
var blockRotation: UIInterfaceOrientationMask = .portrait{
didSet{
if blockRotation.contains(.portrait){
//強制設(shè)置成豎屏
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
}else{
//強制設(shè)置成橫屏
UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
}
}
}
添加 屏幕支持的旋轉(zhuǎn)方向:
extension AppDelegate{
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return blockRotation
}
}
2)在屏幕需要更改旋轉(zhuǎn)狀態(tài)的位置更新旋轉(zhuǎn)方向
為方便獲取AppDelegate
中的blockRotation
屬性蠢笋,添加常量
let kAppdelegate: AppDelegate? = UIApplication.shared.delegate as? AppDelegate
不同的旋轉(zhuǎn)情況藻三,配置如下:
a. 豎屏First -> 橫屏Second
在push跳轉(zhuǎn)前更改旋轉(zhuǎn)方向
@objc func onClickJumpToNextPageBtnAction(){
//進入下一頁面触机,轉(zhuǎn)換為橫屏
let rotation : UIInterfaceOrientationMask = [.landscapeLeft, .landscapeRight]
kAppdelegate?.blockRotation = rotation
let secondVC = SecondVC()
navigationController?.pushViewController(secondVC, animated: true)
}
b. 橫屏Second -> 豎屏First
在pop返回前更改旋轉(zhuǎn)方向
@objc func onClickBackBtnAction(){
//設(shè)置豎屏
kAppdelegate?.blockRotation = .portrait
navigationController?.popViewController(animated: true)
}
c. 橫屏First -> 橫屏Third
屏幕旋轉(zhuǎn)方向未發(fā)生變化,不需要做任何處理
3)做優(yōu)化完善針對特殊的現(xiàn)象
實現(xiàn)以上代碼基本可以實現(xiàn)部分頁面豎屏削锰,部分頁面強制橫屏通铲,但是還會有一些屏幕旋轉(zhuǎn)的瑕疵,可通過如下方式完善
a. 豎屏First -> 橫屏Second -> 橫屏Third
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
//設(shè)置原因: 手機豎屏進入橫屏器贩,狀態(tài)欄默認隱藏颅夺;iPad顯示異常
UIApplication.shared.setStatusBarHidden(false, with: .none)
}
需要在SecondVC中添加上述代碼,設(shè)置狀態(tài)條不隱藏蛹稍,否則iPhone上狀態(tài)欄會默認隱藏(iPad不隱藏吧黄,顯示正常)。異常情況顯示如下:
***b. 豎屏First -> 橫屏Second ***
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//如果不設(shè)置該頁面的豎屏唆姐, 在屏幕鎖定打開的情況下拗慨,豎屏First -> 橫屏Second -> 切換到后臺 -> 進入前臺 -> 返回豎屏First 會出現(xiàn)狀態(tài)欄已豎屏,其他內(nèi)容仍然橫屏切換的問題
UIViewController.attemptRotationToDeviceOrientation()
}
需要在FirstVC中添加上述代碼奉芦,否則在屏幕鎖定打開的情況下赵抢,豎屏First -> 橫屏Second -> 切換到后臺 -> 進入前臺 -> 返回豎屏First 會出現(xiàn)狀態(tài)欄已豎屏,其他內(nèi)容仍然橫屏切換的問題声功。異常情況顯示如下:
正常展示如下:
2.文件配置
1)設(shè)置屏幕支持的旋轉(zhuǎn)方向
2)設(shè)置View controller-based status bar appearance
為NO
3. demo地址:
https://github.com/merrylaugh/ScreenOrientationDemo
三. 細節(jié)解析
1.配置文件 View controller-based status bar appearance
含義:
View controller-based status bar appearance
可以設(shè)置YES
或NO
1)YES: View Controller的對statusBar的設(shè)置優(yōu)先級高于AppDelegate
2)NO: application的設(shè)置優(yōu)先級最高
參考: http://blog.csdn.net/yongyinmg/article/details/39928367
以上僅是個人使用總結(jié),歡迎批評指正補充~~~~~~~
作者:_skye
鏈接:http://www.reibang.com/p/e2bbc312aac2
來源:簡書
著作權(quán)歸作者所有烦却。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處先巴。