最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

配置iOS?16?屏幕旋轉(zhuǎn)適配實(shí)例詳解

 更新時(shí)間:2022年09月23日 11:48:00   作者:Andy_GF  
這篇文章主要為大家介紹了配置iOS?16?屏幕旋轉(zhuǎn)適配實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

我們公司的 app 只支持豎屏, 只有在視頻播放的時(shí)候才可以橫屏, 所以這就需要我們強(qiáng)制去旋轉(zhuǎn)屏幕. 我想一般的 app 大概都會(huì)有這種需求.

最近隨著 iOS16 的更新, 線上的 app 在 iOS16 系統(tǒng)上不管用了, 原因就是蘋果從 iOS16 開始, 更改了屏幕旋轉(zhuǎn)的機(jī)制, 以后都要用 UIWindowScence 這個(gè) API 類. 所以我們的 App 就只能根據(jù)版本去做適配, 新的要支持, 老的也要兼容.

在這里, 我就直接上干貨, 只展示重要代碼, 就不寫 demo, 沒什么技術(shù)含量, 做為一個(gè)日常記錄分享而已.

重點(diǎn)提示

Xcode 14.0MacOS 12.5手機(jī) iOS15.1iOS16

一. AppDelegate 配置

定義一個(gè) bool 類型的變量

全局控制否是橫屏代理方法根據(jù)這個(gè)變量來返回是 豎屏 還是 橫屏, iOS16 及以上可以做到根據(jù)屏幕方向適配橫屏, 我們公司要求不高, 所以我們是強(qiáng)制右橫屏, 這一點(diǎn)是不太友好, 這不是重點(diǎn).

  • 這一步 SwiftObjC 沒什么區(qū)別, 只是語法不同, 所以就只提供了 Swift 代碼.
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    // 定義一個(gè) bool 類型的變量
    var isFullScreen: Bool = false
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        if isFullScreen {
            if #available(iOS 16.0, *) {
                // 16 及以上可以做到根據(jù)屏幕方向適配橫屏
                return .landscape
            } else {
                // 16 以下不方便做, 所以我們是強(qiáng)制 右橫屏
                return .landscapeRight
            }
        }
        return .portrait
    }
}

二. 適配 iOS16 旋轉(zhuǎn)屏幕

在原來基礎(chǔ)上添加適配 iOS16 的代碼 在 VC 中點(diǎn)擊橫屏按鈕時(shí)進(jìn)行強(qiáng)制屏幕旋轉(zhuǎn), 這里強(qiáng)調(diào)一下, 播放器的橫屏按鈕操作最好是回調(diào)到當(dāng)前 VC 中去操作, setNeedsUpdateOfSupportedInterfaceOrientations() 這個(gè)方法是 VC 的對象方法, 這里同樣SwiftObjC 沒什么區(qū)別, 只是語法不同.

func switchOrientation(isFullScreen: Bool) {
        let kAppdelegate = UIApplication.shared.delegate as? AppDelegate
        kAppdelegate?.isFullScreen = isFullScreen
        // 設(shè)置屏幕為橫屏
        if #available(iOS 16.0, *) {
            setNeedsUpdateOfSupportedInterfaceOrientations()
            guard let scence = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
                return
            }
            let orientation: UIInterfaceOrientationMask = isFullScreen ? .landscape : .portrait
            let geometryPreferencesIOS = UIWindowScene.GeometryPreferences.iOS(interfaceOrientations: orientation)
            scence.requestGeometryUpdate(geometryPreferencesIOS) { error in
                print("強(qiáng)制\(isFullScreen ? "橫屏" : "豎屏" )錯(cuò)誤: \(error)")
            }
        } else {
            let oriention: UIDeviceOrientation = isFullScreen ? .landscapeRight : .portrait
            UIDevice.current.setValue(oriention.rawValue, forKey: "orientation")
            UIViewController.attemptRotationToDeviceOrientation()
        }
        // 更新 橫豎屏對應(yīng)的 UI 
        // ...
    }

三. 強(qiáng)制旋轉(zhuǎn)屏幕

在播放器橫豎屏切換按鈕的回調(diào)方法中調(diào)用 旋轉(zhuǎn)屏幕方法即可, 不管手機(jī)有沒有打開自動(dòng)旋轉(zhuǎn), 都可以實(shí)現(xiàn)屏幕方向切換.

    // 播放器 - 全屏按鈕切換回調(diào)
    func playerViewRotateScreen(isFull: Bool) {
        switchOrientation(isFullScreen: isFull)
    }

四. 自動(dòng)旋轉(zhuǎn)

手機(jī)需要打開自動(dòng)旋轉(zhuǎn)開關(guān), 注冊屏幕旋轉(zhuǎn)通知, 監(jiān)聽屏幕旋轉(zhuǎn)時(shí)的方向. 方法不只一種, 但是我就用下面這個(gè).

  • 一定要注意下面這兩個(gè)方法, 否則有可能通知不生效, 一個(gè)開啟一個(gè)關(guān)閉.
    • UIDevice.current.beginGeneratingDeviceOrientationNotifications()
    • UIDevice.current.endGeneratingDeviceOrientationNotifications()
  • 注意: 我這里做的是 16 以下只支持右橫屏, 16 不需要獲取設(shè)備方向, 因此可以支持 左/右橫屏. 這也是 AppDelegate 中區(qū)分版本的原因.

友情提示 :

最好是把側(cè)滑返回手勢給禁掉. 否則橫屏側(cè)滑返回就出問題了, 當(dāng)然也可以做的更精細(xì)些, 橫屏?xí)r禁止. 我做驗(yàn)證就簡單些.

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        UIDevice.current.beginGeneratingDeviceOrientationNotifications()
        NotificationCenter.default.addObserver(self, selector: #selector(screenChangedOrientation(_:)), name: UIDevice.orientationDidChangeNotification, object: nil)
        navigationController?.interactivePopGestureRecognizer?.isEnabled = false
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.interactivePopGestureRecognizer?.isEnabled = true
    }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        NotificationCenter.default.removeObserver(self)
        UIDevice.current.endGeneratingDeviceOrientationNotifications()
    }
    // 橫豎屏監(jiān)聽
    @objc private func screenChangedOrientation(_ notification: Notification) {
        let info = notification.userInfo
        guard let animated = info?["UIDeviceOrientationRotateAnimatedUserInfoKey"] as? Int, animated == 1 else {
            return
        }
        let orientation = UIDevice.current.orientation
        if orientation == UIDeviceOrientation.landscapeLeft || orientation == UIDeviceOrientation.landscapeRight {
            // 橫屏
            videoView.changeScreenOrientation(isFull: true)
        } else if orientation == UIDeviceOrientation.portrait {
            // 豎屏
            videoView.changeScreenOrientation(isFull: false)
        }
    }

以上就是配置iOS 16 屏幕旋轉(zhuǎn)適配實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于iOS 16 屏幕旋轉(zhuǎn)適配的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解iOS App中UITableView的創(chuàng)建與內(nèi)容刷新

    詳解iOS App中UITableView的創(chuàng)建與內(nèi)容刷新

    這篇文章主要介紹了iOS App中UITableView的創(chuàng)建與內(nèi)容刷新,講解了UITableView一些基本的樣式與cell的設(shè)置及刷新,需要的朋友可以參考下
    2016-04-04
  • IOS中(assign,retain,copy,weak,strong)的區(qū)別以及nonatomic的含義

    IOS中(assign,retain,copy,weak,strong)的區(qū)別以及nonatomic的含義

    這篇文章主要介紹了我們在聲明@property 屬性時(shí),總是要在括號中寫上assign、retain、copy、weak、strong中的一個(gè),他們的區(qū)別,需要的朋友可以參考下
    2017-03-03
  • 總結(jié)IOS界面間跳轉(zhuǎn)的幾種方法

    總結(jié)IOS界面間跳轉(zhuǎn)的幾種方法

    前段時(shí)間被問到界面間的跳轉(zhuǎn)有幾種方式?想不到說的竟有點(diǎn)含糊其辭,于是就想總結(jié)一下。有句話說的好,“前人種樹,后人乘涼”,目前作為一個(gè)乘涼者,我也希望能種一些樹木,為代碼世界營造一份清新。好了,話不多說,進(jìn)入主題。
    2016-08-08
  • Xcode使用教程詳細(xì)講解(全)

    Xcode使用教程詳細(xì)講解(全)

    本文介紹的是Xcode使用教程詳細(xì)講解,Xcode是一個(gè)款強(qiáng)大的IDE開發(fā)環(huán)境,就像你在寫Windows程序時(shí)需要VS2005一樣 需要要Xcode為你寫Mac程序提供環(huán)境
    2015-07-07
  • 淺析iOS的Xcconfig

    淺析iOS的Xcconfig

    本篇文章介紹IOS中Xcconfig的相關(guān)知識內(nèi)容,有興趣的朋友學(xué)習(xí)下吧。
    2018-01-01
  • 詳解iOS 用于解決循環(huán)引用的block timer

    詳解iOS 用于解決循環(huán)引用的block timer

    這篇文章主要介紹了詳解iOS 用于解決循環(huán)引用的block timer,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • iOS設(shè)置圓角的三種方式

    iOS設(shè)置圓角的三種方式

    本文給大家分享ios設(shè)置圓角的三種方式,相對來說最簡單的一種是第一種方法,具體內(nèi)容詳情參考下本文
    2017-03-03
  • iOS用AutoLayout實(shí)現(xiàn)分頁滾動(dòng)功能

    iOS用AutoLayout實(shí)現(xiàn)分頁滾動(dòng)功能

    這篇文章主要給大家介紹了關(guān)于iOS用AutoLayout實(shí)現(xiàn)分頁滾動(dòng)功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • IOS網(wǎng)絡(luò)請求之NSURLSession使用詳解

    IOS網(wǎng)絡(luò)請求之NSURLSession使用詳解

    這篇文章主要介紹了IOS網(wǎng)絡(luò)請求之NSURLSession使用詳解,今天使用NSURLConnection分別實(shí)現(xiàn)了get、post、表單提交、文件上傳、文件下載,有興趣的可以了解一下。
    2017-02-02
  • iOS實(shí)現(xiàn)左右可滑動(dòng)的選擇條實(shí)例代碼分享

    iOS實(shí)現(xiàn)左右可滑動(dòng)的選擇條實(shí)例代碼分享

    本文通過實(shí)例代碼給大家介紹了ios實(shí)現(xiàn)左右可滑動(dòng)的選擇條功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2017-03-03

最新評論

南澳县| 普安县| 大庆市| 信阳市| 阿克陶县| 鹿泉市| 楚雄市| 博爱县| 尼玛县| 佛冈县| 嘉禾县| 乌鲁木齐市| 永仁县| 临桂县| 新丰县| 南汇区| 乐都县| 遂宁市| 穆棱市| 汉寿县| 乡城县| 高雄县| 梁山县| 凤翔县| 沁水县| 闽清县| 太康县| 兴仁县| 大关县| 泰州市| 遂川县| 昭觉县| 怀化市| 沙坪坝区| 涟源市| 沂源县| 大竹县| 探索| 晋城| 辛集市| 双江|