iOS Orientation 屏幕旋转
一、两种orientation
了解屏幕旋转首先需要区分两种orientation
1、device orientation
设备的物理方向,由类型UIDeviceOrientation
表示,当前设备方向获取方式:
1 |
|
该属性的值一般是与当前设备方向保持一致的,但须注意以下几点:
①文档中对该属性的注释:
1 |
|
所以更推荐下面这种用法:
1 2 3 4 5 6 7 |
|
②系统横竖屏开关关闭时
如果关闭了系统的横竖屏切换开关,即系统层级只允许竖屏时,再通过上述方式获取到的设备方向将永远是UIDeviceOrientationUnknown
。可以通过Core Motion
中的CMMotionManager
来获取当前设备方向。
2、interface orientation
界面显示的方向,由类型UIInterfaceOrientation
表示。当前界面显示方向有以下两种方式获取:
1 2 |
|
即可以通过系统statusBar的方向或者viewController的方向来获取当前界面方向。
3、二者区别
通过UIDevice
获取到的设备方向在手机旋转时是实时的,通过UIApplication
的statusBar或者viewController获取到的界面方向在下述方法:
1 |
|
调用以后才会被更改成最新的值。
二、相关枚举定义
1、UIDeviceOrientation:
1 2 3 4 5 6 7 8 9 |
|
2、UIInterfaceOrientation:
1 2 3 4 5 6 7 |
|
从宏定义可知,device方向比interface多了两个定义:UIDeviceOrientationFaceUp
和UIDeviceOrientationFaceDown
,分别表示手机水平放置,屏幕向上和屏幕向下。
三、相关方法
1、iOS5中控制屏幕旋转的方法:
1 2 |
|
如果打算支持toInterfaceOrientation对应的方向就返回YES,否则返回NO。
2、iOS6中控制屏幕旋转相关方法:
1 2 3 4 5 |
|
第一个方法决定是否支持多方向旋转屏,如果返回NO则后面的两个方法都不会再被调用,而且只会支持默认的UIInterfaceOrientationMaskPortrait方向;
第二个方法直接返回支持的旋转方向,该方法在iPad上的默认返回值是UIInterfaceOrientationMaskAll
,iPhone上的默认返回值是UIInterfaceOrientationMaskAllButUpsideDown
,详情见官方Q&A文档;
第三个方法返回最优先显示的屏幕方向,比如同时支持Portrait和Landscape方向,但想优先显示Landscape方向,那软件启动的时候就会先显示Landscape,在手机切换旋转方向的时候仍然可以在Portrait和Landscape之间切换;
3、attemptRotationToDeviceOrientation方法
从iOS5开始有了这个新方法:
1 2 3 |
|
该方法的使用场景是interface orientation和device orientation不一致,但希望通过重新指定interface orientation的值,立即实现二者一致;如果这时只是更改了支持的interface orientation的值,没有调用attemptRotationToDeviceOrientation,那么下次device orientation变化的时候才会实现二者一致,关键点在于能不能立即实现。
举个例子:
假设当前的interface orientation只支持Portrait,如果device orientation变成Landscape,那么interface orientation仍然显示Portrait;
如果这时我们希望interface orientation也变成和device orientation一致的Landscape,以iOS6为例,需要先将supportedInterfaceOrientations的返回值改成Landscape,然后调用attemptRotationToDeviceOrientation方法,系统会重新询问支持的interface orientation,已达到立即更改当前interface orientation的目的。
四、如何决定interface orientation
1、全局控制
Info.plist文件中,有一个Supported interface orientations
,可以配置整个应用的屏幕方向,此处为全局控制。
2、UIWindow
iOS6的UIApplicationDelegate提供了下述方法,能够指定 UIWindow 中的界面的屏幕方向:
1 |
|
该方法默认值为Info.plist中配置的Supported interface orientations
项的值。
iOS中通常只有一个window,所以此处的控制也可以视为全局控制。
3、controller
只有以下两种情况:
- 当前controller是window的rootViewController
- 当前controller是modal模式的
时,orientations相关方法才会起作用(才会被调用),当前controller及其所有的childViewController都在此作用范围内。
4、最终支持的屏幕方向
前面所述的3种控制规则的交集就是一个controller的最终支持的方向;
如果最终的交集为空,在iOS6以后会抛出UIApplicationInvalidInterfaceOrientationException
崩溃异常。
四、强制屏幕旋转
如果interface和device方向不一样,想强制将interface旋转成device的方向,可以通过attemptRotationToDeviceOrientation实现,但是如果想将interface强制旋转成任一指定方向,该方式就无能为力了。
不过聪明的开发者们总能想到解决方式:
1、私有方法
1 |
|
但是现在苹果已经将该方法私有化了,越狱开发的同学可以试试,或者自己想法子骗过苹果审核吧。
2、旋转view的transform
也可以通过旋转view的transform属性达到强制旋转屏幕方向的目的,但个人感觉这不是靠谱的思路,可能会带来某些诡异的问题。
3、主动触发orientation机制
要是能主动触发系统的orientation机制,调用orientation相关方法,使新设置的orientation值起作用就好了。这样只要提前设置好想要支持的orientation,然后主动触发orientation机制,便能实现将interface orientation旋转至任意方向的目的。
万能的stackoverflow上提供了一种主动触发的方式:
在iOS4和iOS6以后:
1 2 3 4 |
|
iOS5中:
1 2 3 4 |
|
这种方式会触发UIKit重新调用controller的orientation相关方法,以达到在device方向不变的情况下改变interface方向的目的。
虽然不优雅,但却能解决问题,凑合吧。。
PS:
话说iOS8中的屏幕旋转相关方法又变化了,表示适配起来很蛋疼。。。
iOS Orientation 屏幕旋转相关推荐
- [iOS]监控屏幕旋转
[iOS]监控屏幕旋转 - (void)viewDidLoad {[super viewDidLoad];//设备旋转通知[[UIDevice currentDevice] beginGenerati ...
- iOS开发屏幕旋转锁定横竖屏解决方法
iOS开发屏幕旋转锁定横竖屏解决方法 使用场景: 公司最近产品,有两个界面是横屏的,其他的界面是竖屏的.针对这个需求,也调试了一段时间.在网上也查找了不少资料. 解决的方案也是有的,但是都是需要在导航 ...
- 关于iOS的屏幕旋转的问题
新建工程后,旋转的设置大多是如图 此时,屏幕旋转都是按照此设置的方向旋转的,- (BOOL)shouldAutorotate 等没有响应 如要设置每页不同的旋转方向,需要打开如下设置 此时将根据 1. ...
- iOS 动态控制屏幕旋转
本文讲述动态控制自动旋转方向(1到3),手动旋转屏幕方向(第4),以及通过旋转vc的view假旋转屏幕方向. 1.配置vc可以旋转 在需要配置方向的vc中 覆盖这个函数 - (BOOL)shouldA ...
- ios禁止屏幕旋转的几种方法
一般的应用,只会支持竖屏正方向一个方向,支持多个屏幕方向的应用还是比较少的. 不过我在工作的项目中,跟这个屏幕方向接触比较多,因为我们是一个有界面的 SDK,要让接入方接入的,一开始做没什么经验,考 ...
- IOS:屏幕旋转与Transform
iTouch,iPhone,iPad设置都是支持旋转的,如果我们的程序能够根据不同的方向做出不同的布局,体验会更好. 如何设置程序支持旋转呢,通常我们会在程序的info.plist中进行设置Suppo ...
- iOS中屏幕旋转问题解决
https://blog.csdn.net/black_house/article/details/42460127 竖屏点击按钮 旋转到横屏 [[UIDevice currentDevice] se ...
- IOS 监控屏幕旋转
在viewDidLoad中增加通知 - (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor blac ...
- IOS 屏幕旋转Orientation总结
IOS Orientation, 想怎么转就怎么转~~~ 此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. 博客: htt ...
- iOS屏幕旋转 浅析
一.两种orientation 了解屏幕旋转首先需要区分两种orientation 1.device orientation 设备的物理方向,由类型UIDeviceOrientation表示,当前设备 ...
最新文章
- 大数据加入渗透实体,错过它你将错过一个时代!
- 给自己的Unity添加声音文件
- 【半译】两个gRPC的C#库:grpc-dotnet vs Grpc.Core
- 【渝粤教育】国家开放大学2018年春季 7218-21T医学伦理学(本) 参考试题
- 解决:Chrome 插件安装时提示 程序包无效:“CRX_HEADER_INVALID“
- Android 那些年,处理getActivity()为null的日子
- 枚举类 enum,结构体类 struct
- java ecc signature_如何用python验证android/java的ECC签名
- Processing编程学习指南2.5 Processing中的代码
- VBA—EXCEL操作集合—05
- 随机信号分析基础——基础篇(数字特征)
- 【大话Mysql面试】-常见SQL语句书写
- BOS金蝶云星空开发简单账表
- 基于python的视频监控系统_Python远程视频监控程序
- 技术宅学会几招FFmpeg
- 公众号学生成绩管理查询系统
- 小米造车,雷军赌上个人声誉的一战
- 软件工程论文书写设计步骤及如何降低重复率
- Qt网络编程——get请求
- QA和QC到底是什么区别?
热门文章
- 防盗报警器c语言程序,(完整版)基于单片机的家庭防盗报警系统doc毕业论文
- 手机安装php7,php7.3编译安装时报错system libzip must be upgraded to version = 0.11
- 影子卫士 Shadow Defender 2011
- 直通串口线和交叉串口线
- 详解语言模型NGram及困惑度Perplexity
- 模电笔记3 三极管 光电三极管
- 3维图像处理的新星--Open3D(实操过程持续更新ing....
- 深入理解Instrument
- Python教程(从不懂到入门)
- 三极管与稳压管恒流电路