橫豎屏切換 (swift)

一. 需求

APP中需要支持橫屏和豎屏,并在不同的頁(yè)面 可支持的屏幕旋轉(zhuǎn)方向不一致

  1. 整體豎屏,部分強(qiáng)制橫屏
  2. 整體橫屏,部分強(qiáng)制豎屏
    如下:


    橫屏.gif

二. 實(shí)現(xiàn)

不廢話,直接上代碼

1. 代碼層

1)AppDelegate.swift文件添加對(duì)屏幕旋轉(zhuǎn)的支持

添加屬性:

 var blockRotation: UIInterfaceOrientationMask = .portrait{
        didSet{
            if blockRotation.contains(.portrait){
                //強(qiáng)制設(shè)置成豎屏
                UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
            }else{
                //強(qiáng)制設(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(){
        //進(jìn)入下一頁(yè)面,轉(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)化完善針對(duì)特殊的現(xiàn)象

實(shí)現(xiàn)以上代碼基本可以實(shí)現(xiàn)部分頁(yè)面豎屏,部分頁(yè)面強(qiáng)制橫屏,但是還會(huì)有一些屏幕旋轉(zhuǎn)的瑕疵,可通過(guò)如下方式完善

a. 豎屏First -> 橫屏Second -> 橫屏Third

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        //設(shè)置原因: 手機(jī)豎屏進(jìn)入橫屏,狀態(tài)欄默認(rèn)隱藏;iPad顯示異常
        UIApplication.shared.setStatusBarHidden(false, with: .none)
    }

需要在SecondVC中添加上述代碼,設(shè)置狀態(tài)條不隱藏,否則iPhone上狀態(tài)欄會(huì)默認(rèn)隱藏(iPad不隱藏,顯示正常)。異常情況顯示如下:


未設(shè)置導(dǎo)航欄顯示.gif

***b. 豎屏First -> 橫屏Second ***

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        //如果不設(shè)置該頁(yè)面的豎屏, 在屏幕鎖定打開(kāi)的情況下,豎屏First -> 橫屏Second -> 切換到后臺(tái) -> 進(jìn)入前臺(tái) -> 返回豎屏First 會(huì)出現(xiàn)狀態(tài)欄已豎屏,其他內(nèi)容仍然橫屏切換的問(wèn)題
        UIViewController.attemptRotationToDeviceOrientation()
    }

需要在FirstVC中添加上述代碼,否則在屏幕鎖定打開(kāi)的情況下,豎屏First -> 橫屏Second -> 切換到后臺(tái) -> 進(jìn)入前臺(tái) -> 返回豎屏First 會(huì)出現(xiàn)狀態(tài)欄已豎屏,其他內(nèi)容仍然橫屏切換的問(wèn)題。異常情況顯示如下:

未設(shè)置返回刷新.gif

正常展示如下:


設(shè)置返回刷新.gif

2.文件配置

1)設(shè)置屏幕支持的旋轉(zhuǎn)方向

ED6EB62ECF96028E04F74230530C5493.png

2)設(shè)置View controller-based status bar appearanceNO

2B4CE4167549B580451535D732C43C57.png

3. demo地址:

https://github.com/merrylaugh/ScreenOrientationDemo

三. 細(xì)節(jié)解析

1.配置文件 View controller-based status bar appearance含義:

View controller-based status bar appearance可以設(shè)置YESNO
1)YES: View Controller的對(duì)statusBar的設(shè)置優(yōu)先級(jí)高于AppDelegate
2)NO: application的設(shè)置優(yōu)先級(jí)最高

參考: http://blog.csdn.net/yongyinmg/article/details/39928367


以上僅是個(gè)人使用總結(jié),歡迎批評(píng)指正補(bǔ)充~~~~~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文基于 Swift 3.x,由于 Swift 4.x 在語(yǔ)法規(guī)則上有較大變動(dòng),后續(xù)出一個(gè) Swift 4.x 版...
    emmet7life閱讀 10,600評(píng)論 4 21
  • 概述 寫(xiě)代碼就是在不斷填坑的過(guò)程中慢慢成長(zhǎng),程序員哪有不遇坑的呢? 這篇文章來(lái)談?wù)刬OS中橫豎屏切換的一些坑,橫豎...
    jumpingfrog0閱讀 11,486評(píng)論 6 21
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,043評(píng)論 4 61
  • 1、專注高效工作兩小時(shí) 2、OmniFocus 切換 3、買(mǎi)書(shū)皮
    d12756f26499閱讀 117評(píng)論 0 0
  • 我看過(guò)太多的拿規(guī)則當(dāng)游戲的人結(jié)果曇花一現(xiàn),也見(jiàn)過(guò)很多堅(jiān)守規(guī)則的人最后反倒吃了虧。我認(rèn)為不是說(shuō)我們這個(gè)環(huán)境讓守規(guī)則的...
    老張和他的朋友們閱讀 486評(píng)論 0 2

友情鏈接更多精彩內(nèi)容