关于iOS屏幕旋转的一些注意事项

发布时间 - 2026-01-10 22:31:10    点击率:

前言

最近有个需求,是在App中有一个查看文件的页面,由于查看文件横屏会更方便阅读,所以boss说要让这个页面可以横屏。之前都没有接触过横屏的具体实现方法,一开始走了不少弯路,而且各种bug。在这里把遇到的问题分享一下,希望对大家有点帮助。

要让你的APP支持旋转,你需要进行如下几个步骤

1、 全局配置

在工程->TARGETS->General->Deployment Info中配置


在AppDelegate中配置

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{
 return UIInterfaceOrientationMaskAllButUpsideDown;
}

2、 全局配置做好了,你就可以在控制器中实现相应的旋转方法来让你的APP支持旋转了

我们需要在什么地方实现控制器的旋转方法呢?

有以下两种情况

1、当前控制器是window的rootViewController由rootViewController来管理旋转的相关方法

典型的有 UINavigationController、UITableBarController

2、当前控制器是modal模式的时(控制器为modal显示的控制器),由该控制器自己管理旋转的相关方法

即控制器是通过 presentViewController:animated:completion: 方式出来的

控制器的旋转方法介绍

控制器的旋转方法在iOS6之前和之后有了比较大的变化

1、在iOS6 之前只需要实现下面这个方法就可以

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
}

2、在iOS6之后由下面两个方法替代

//是否支持旋转
- (BOOL)shouldAutorotate {
 return YES; 
}
//所支持的方法集合,是一个枚举类
- (NSUInteger)supportedInterfaceOrientations {
 return UIInterfaceOrientationMaskLandscape; 
}

下面我重点讲一下在iOS6之后旋转方法的使用情况。因为在iOS6+、7、8中和iOS9中这两个方法的调用顺序以及处理逻辑是不一样的(坑)

控制器的旋转方法使用

1、iOS6+、7、8中会先调用shouldAutorotate判断屏幕是否支持旋转

  1. 该方法返回YES,就会去调用supportedInterfaceOrientations检查控制器支持的方向枚举集合,如果存在符合设备所处的方向枚举集合,屏幕会执行相应的旋转,如果不存在设备所处的方向枚举,屏幕就不会旋转,停止检查
  2. 该方法返回NO,屏幕不能够旋转,停止检查

2、iOS9+中会先调用supportedInterfaceOrientations来检查控制器支持的方向枚举集合

  1. 如果方向枚举集合中没有符合设备所处的方向枚举,就不会去调用shouldAutorotate方法,屏幕不会旋转,停止检查
  2. 如果方向枚举集合中有符合设备所处的方向枚举,那么就会去调用shouldAutorotate方法

             如果该返回YES,屏幕执行相应的旋转

             如果该返回NO,屏幕不会旋转,停止检查

3、关于preferredInterfaceOrientationForPresentation方法,该方法的作用是返回最优先显示的屏幕方向。在iOS7之后就不会调用了,但是网上说在iOS7之前需要加上,不加会崩溃(没有亲测)

总结

写这边文章主要是因为之前在网上看了很多资料,但是并有提到旋转方法他们的调用顺序以及处理逻辑的介绍,大部分都是抄来抄去,没有经过自己试验的代码也贴到网上来,坑了我千万遍。

以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能有一定的帮助,亲身试验的东西才是硬道理,如果有疑问大家可以留言交流。


# ios10屏幕旋转  # ios监听屏幕旋转  # ios  # 屏幕旋转适配  # IOS 屏幕适配方案实现缩放window的示例代码  # iOS屏幕适配开发实用技巧  # iOS实现手动和自动屏幕旋转  # iOS屏幕旋转与锁屏的示例代码  # 配置iOS 16 屏幕旋转适配实例详解  # 所处  # 会去  # 中有  # 要让  # 会先  # 都是  # 是一个  # 他们的  # 是在  # 在这里  # 看了  # 有个  # 走了  # 就不  # 两种  # 网上  # 有一定  # 这两个  # 不存在  # 只需要 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Python制作简易注册登录系统  如何快速完成中国万网建站详细流程?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  高端建站三要素:定制模板、企业官网与响应式设计优化  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  如何快速搭建安全的FTP站点?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  如何确保FTP站点访问权限与数据传输安全?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  html如何与html链接_实现多个HTML页面互相链接【互相】  如何快速选择适合个人网站的云服务器配置?  黑客入侵网站服务器的常见手法有哪些?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何在橙子建站上传落地页?操作指南详解  如何在Windows服务器上快速搭建网站?  Android okhttputils现在进度显示实例代码  如何快速生成橙子建站落地页链接?  node.js报错:Cannot find module 'ejs'的解决办法  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Python结构化数据采集_字段抽取解析【教程】  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  电商网站制作价格怎么算,网上拍卖流程以及规则?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  如何在建站宝盒中设置产品搜索功能?  如何在企业微信快速生成手机电脑官网?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  lovemo网页版地址 lovemo官网手机登录  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何自定义建站之星模板颜色并下载新样式?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  如何快速生成专业多端适配建站电话?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  如何快速建站并高效导出源代码?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  php json中文编码为null的解决办法  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  大学网站设计制作软件有哪些,如何将网站制作成自己app?  微信推文制作网站有哪些,怎么做微信推文,急?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】