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

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

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

正文

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

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

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

重點提示

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

一. AppDelegate 配置

定義一個 bool 類型的變量

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

  • 這一步 SwiftObjC 沒什么區(qū)別, 只是語法不同, 所以就只提供了 Swift 代碼.
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    // 定義一個 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 中點擊橫屏按鈕時進(jìn)行強(qiáng)制屏幕旋轉(zhuǎn), 這里強(qiáng)調(diào)一下, 播放器的橫屏按鈕操作最好是回調(diào)到當(dāng)前 VC 中去操作, setNeedsUpdateOfSupportedInterfaceOrientations() 這個方法是 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 ? "橫屏" : "豎屏" )錯誤: \(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ī)有沒有打開自動旋轉(zhuǎn), 都可以實現(xiàn)屏幕方向切換.

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

四. 自動旋轉(zhuǎn)

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

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

友情提示 :

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

    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)適配實例詳解的詳細(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 屬性時,總是要在括號中寫上assign、retain、copy、weak、strong中的一個,他們的區(qū)別,需要的朋友可以參考下
    2017-03-03
  • 總結(jié)IOS界面間跳轉(zhuǎn)的幾種方法

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

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

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

    本文介紹的是Xcode使用教程詳細(xì)講解,Xcode是一個款強(qiáng)大的IDE開發(fā)環(huán)境,就像你在寫Windows程序時需要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,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • iOS設(shè)置圓角的三種方式

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

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

    iOS用AutoLayout實現(xiàn)分頁滾動功能

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

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

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

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

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

最新評論

奉贤区| 临潭县| 宝山区| 静乐县| 周口市| 玛曲县| 江川县| 周至县| 光泽县| 黄冈市| 西盟| 鹤岗市| 资阳市| 缙云县| 太原市| 新野县| 西昌市| 广丰县| 云浮市| 吴川市| 钦州市| 惠来县| 柞水县| 固始县| 堆龙德庆县| 大方县| 西平县| 阜康市| 五原县| 涪陵区| 金山区| 新丰县| 汶上县| 屏山县| 牙克石市| 岳池县| 渑池县| 牙克石市| 萨迦县| 上高县| 信宜市|