关于iOS16 以后屏幕旋转不得不说的事

news2025/4/16 19:08:22

由于笔者最近刚完成了一个强制屏幕横屏的需求 所以 顺便记录一下 实现过程中遇到 block点 也为广大的iOS开发者做一个笔记:

废话不多说直接上代码

 //适配iOS16.0的横竖屏方法
    public static func switchInterfaceWtihIos16(orientation: UIInterfaceOrientation , orientationMask: UIInterfaceOrientationMask) {
        if #available(iOS 16.0, *) {
            let array = UIApplication.shared.connectedScenes
            let geometryPreferencesIOS = UIWindowScene.GeometryPreferences.iOS(interfaceOrientations: orientationMask)
            if  let scene = array.first as? UIWindowScene {
                UIViewController.attemptRotationToDeviceOrientation()
                SystemManager.currentViewController()?.setNeedsUpdateOfSupportedInterfaceOrientations()
                scene.requestGeometryUpdate(geometryPreferencesIOS) { e in
                    log.info("iOS16 屏幕旋转失败:error \(e)")
                    scene.requestGeometryUpdate(geometryPreferencesIOS)
                }
            }

        } else {
            let resetOrientationTarget = NSNumber(value: UIInterfaceOrientation.unknown.rawValue)
            UIDevice.current.setValue(resetOrientationTarget, forKey: "orientation")
            let orientationTarget = NSNumber(value: orientation.rawValue)
            UIDevice.current.setValue(orientationTarget, forKey: "orientation")
        }
    }

值得一提的是 iOS16以后新增了GeometryPreferences 方法来旋转屏幕,所以设置横竖屏需要 使用的新的方法,并且入参为 UIInterfaceOrientationMask

调用上述方法以后 还要在需要实现横屏controller重写下面的方法和属性

    // 是否支持旋转
    open override var shouldAutorotate: Bool {
        return false
    }
    
    // 支持的方向
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .landscapeRight
    }
    // 首次展示的方向
    open override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
        return  .landscapeRight
    }
    @available(iOS 16.0, *)
    public override func setNeedsUpdateOfSupportedInterfaceOrientations() {
        let orientation = UIDevice.current.orientation
        if orientation == .landscapeLeft || orientation == .landscapeRight || orientation == .faceUp || orientation == .faceDown || isLandScreen {
            player.setfullScreen(isFull: true)
        } else {
            player.setfullScreen(isFull: false)
        }
    }

islandscreen 是我用来判断是否横屏的一个bool,直接复制可能会报错。大家复制后删除该判断再根据实际情况去修改就好

接下来着重说明一下 setNeedsUpdateOfSupportedInterfaceOrientations ,
这个是iOS16以后 的一个新方法,它的作用就是 每当屏幕旋转就会进入这个回调方法。当然你也可以主动调用,正如开篇方法中SystemManager.currentViewController()?.setNeedsUpdateOfSupportedInterfaceOrientations()
它的作用就是主动进入该方法中 。

然后通过查阅其他博主文章,如果想要屏幕旋转正常还需要加上UIViewController.attemptRotationToDeviceOrientation()
下面是官方描述 :

Summary

Attempts to rotate all windows to the orientation of the device.

所以老铁加上没毛病
这里总结一下

  1. 新建一个工具类或者拓展,加入代码块一 内容
  2. 在需要横竖屏的controller,复制 代码块二 内容
  3. 然后如果你的项目之前还没有做过横竖屏的适配你还得请添加图片描述
    做截图相关配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

墨水屏服务更新及测试

一、更新墨水屏服务 ①删除tomcat/webapps/esls_new 缓存目录 ②替换新的esls_new.war ③重启tomcat,等待war包解压完成 ④修改数据库配置applicationContext-common.xml和回调接口配置urlConfig.properties ⑤重启tomcat 重启tomcat: tomcat/bin/shutdown.s…

我们还需要 SRE 吗?

在 「一文讲透研发,SRE,运维,DevOps 的区别」里,我们讲了几大工种的区别,这篇我们重点讲一下 SRE (Site Reliability Engineering)。 SRE 的兴起 SRE 最早起源于 2003,由 Google 提出。SRE 既是一种理念&a…

Linux Vim三种工作模式(命令模式、输入模式和编辑模式)详解

Linux 系统中所有的内容都以文件的形式进行存储,当在命令行下更改文件内容时,常会用到文本编辑器。 我们首选的文本编辑器是 Vim。使用 Vim 编辑文件时,存在 3 种工作模式,分别是命令模式、输入模式和编辑模式,这 3 种…

一文讲透研发,SRE,运维,DevOps 的区别

研发,SRE ,运维是工种,而 DevOps 是体系。如果拿足球来打比方,研发,SRE ,运维对应的就是前锋,中场,后卫这样的位置,而 DevOps 则是诸如 4-3-3 这样的阵型。 研发 也叫研…

聊聊如何独立使用ribbon实现业务客户端负载均衡

前言 ribbon是Netflix开源的客户端负载均衡工具,ribbon实现一系列的负载均衡算法,通过这些负载均衡算法去查找相应的服务。ribbon被大家所熟知,可能是来源于spring cloud,今天就来聊聊如何单独使用ribbon来实现业务客户端负载均衡…

我心中的编程语言之王:Python

我心中的编程语言之王:Python 在当今日益发展的信息技术领域,编程语言的地位愈发重要。它们是构建现代软件和应用的基石,也是实现科技进步的关键工具。在众多编程语言中,Python 以其简单、易用、高效等诸多优点,成为了…

Dubbo架构分层总结

进来闲来无事看了些有关dubbo源码的书籍和《极客时间》何辉老师的课程,由于知识点比较碎,遂以笔记的方式纪录,毕竟好记性不如烂笔头,也希望对感情趣的同学提供点帮助 假设你是个新手开发者,可能只是简单使用过dubbo框…

数字孪生世界建设核心能力:数据治理能力

随着世界经济由工业经济向数字经济转型,数据逐步成为关键的生产要素,企业开始将数据作为一种战略资产进行管理。数据从业务中产生,在IT系统中承载,要对数据进行有效治理,需要业务充分参与,IT系统确保遵从&a…

前端开发必须要知道的package.json文件

前言 package.json 文件是一个 Node.js 项目的配置文件,用于描述项目的元数据信息(如名称、版本、作者、依赖等),以及运行和构建该项目所需的脚本命令。 在项目开发过程中, package.json 文件的维护和更新是非常重要…

Axure8 零基础操作入门

参考:黑马产品经理课程 视频资源:day1&day2,Axure部分 Axure8常用功能 选择/缩放 选择 包含选中:全部选中才有效(避免误操作,建议使用这个)相交选中:相交即全选中 缩放 元件等…

PHP开发工具22-PHP中安装和使用xdebug

文章目录 前言配置详解总结 前言 本文已收录于PHP全栈系列专栏:PHP快速入门与实战 作为一个程序员,千万不要说你没有用过debug工具,不然有点说不过去。xdebug是PHP语言一个强大的利器,用他可以做很多事情。 xdebug是PHP开发者常…

提升编程效率:你不能错过的18款VS Code扩展

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势,学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的,我们出的钱 体验地…

LTV-5341-ASEMI代理台湾光宝高速光耦LTV-5341

编辑:ll LTV-5341-ASEMI代理台湾光宝高速光耦LTV-5341 型号:LTV-155E 品牌:光宝 封装:LSOP-5 引脚数量:5 类型:光耦 特性:台湾光宝、IGBT驱动器、储能专用光耦\高速光耦 封装…

pnpm项目运行启动以及如何迁移到内网

1.迁移前的准备 首先看对node版本和pnpm版本的要求是什么,我的是自己电脑(windows系统)和内网电脑(windows系统)上的环境一致的 我的项目要求是 1.node版本 16.20.0 2.pnpm版本 8.6.2 需要先将node 和 pnpm 安装好相应…

今年前改BUG,下午就被通知在改进优化了

内卷可以说是 2023 年最火的一个词了。2022 年刚开始,在很多程序员网站看到很多 Java 程序员的 2023 年度总结都是:Java 越来越卷了(手动狗头),2023 年是被卷的一年。前有几百万毕业生虎视眈眈,后有在职人员…

slam十四讲 03 Eigen实践之三维空间刚体运动

目录 1 初始化 2 旋转空间中的向量 3 欧拉角 4 变换矩阵 5 四元素 完整程序 1 初始化 旋转的两种办法: (1)旋转矩阵:a Ra, a R^T a, 旋转矩阵的特性:是一个行列式为1的正交矩阵. 三维空间的旋转是3x3矩阵&am…

基于SpringBoot的校园请假管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 校园请假信息管理系统…

php质量检查工具 phpmd的使用

PHPMD简介 团队在使用php-cs-fixer 代码格式自动式化工具之后,在格式,代码错误等方面带来了很大便利,不过在命名,代码质量,代码复杂度,缺少一些检查,在网上搜索后,发现PHPMD 一个PHP代码静态分析工具. 安装 官方网站 github 你可以直接到下载页面封装好的 phar 包&#xff1…

云原生数据库受到青睐,亚马逊云科技数据库提供多项功能

小小的改变,标志一个新时代的全面开启,一个数据库的云原生时代。前不久,Gartner公布了一组数据,引起了不小的讨论度。在2022年全球数据库管理系统的市场份额排名中,作为纯云厂商的亚马逊云科技,超越了老牌传…

一种基于目标的可解释的自动驾驶预测和规划策略

摘要: 本文介绍了一种通过理性逆向规划进行目标识别和多模态轨迹预测的方法。通过将目标识别与MCTS 计划相结合,为自车生成优化计划。 最近炒得比较火的影子模式实际就是在通过数据收集的方式不断模拟自动驾驶系统按照人类驾驶习惯实现人之间的交互过程…