iPhone屏幕旋转机制详解
主要说一下本人对iOS6.0及以前版本中对屏幕旋转的操作:包括重力感应旋转和强制旋转。
首先说一下重力感应引起的屏幕旋转。
在iOS6.0以前,只需要UIViewController的子类重载 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation函数即可实现屏幕是否旋转。该方法返回YES,便支持四个方向的旋转。要指定特定的方向旋转,就返回 toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft 之类的值,具体哪个方向,根据你的需要而定。该方法默认是返回NO的,即不支持旋转。但是在iOS6.0及以后,- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation方法被置为Deprecated,该方法也不会被调用了。取而代之的是 -(BOOL)shouldAutorotate方法和 - (NSUInteger)supportedInterfaceOrientations方法。前者设置屏幕是否可以旋转,后者设置屏幕允许旋转的方向。前者默认返回YES,后者默认返回除倒置外的三个方向。即默认情况下是允许屏幕旋转的。具体用法是-(BOOL)shouldAutorotate只返回YES或NO, - (NSUInteger)supportedInterfaceOrientations方法返回指定的方向,比如 UIInterfaceOrientationMaskAllButUpsideDown。但是这两个方法,在iOS6.0以前是不会被调用的。只适合iOS6.0及以后。
再说一下屏幕强制旋转的实现方法。
该方法使用的是 http://blog.csdn.net/starryheavens/article/details/8083644 中的第一种方法。通过获取系统电池的方向从而得到屏幕的方向,然后通过改变电池的方向来改变状态栏的方向。但这样做的一个弊端是需要人为的改变view的transform属性,要自己维护view上面控件在旋转之后的布局。
具体办法:
view.transform一般是View的旋转,拉伸移动等属性,类似view.layer.transform,区别在于View.transform是二维的,也就是使用仿射的办法通常就是带有前缀CGAffineTransform的类(可以到API文档里面搜索这个前缀的所有类),而view.layer.transform可以在3D模式下面的变化,通常使用的都是前缀为CATransform3D的类。
这里要记住一点,当你改变过一个view.transform属性或者view.layer.transform的时候需要恢复默认状态的话,记得先把他们重置可以使用view.transform =CGAffineTransformIdentity,或者view.layer.transform =CATransform3DIdentity,假设你一直不断的改变一个view.transform的属性,而每次改变之前没有重置的话,你会发现后来的改变和你想要的发生变化了,不是你真正想要的结果。
好了,上面介绍了旋转的属性,接下来就是关键了。官方提供了一个办法就是查看当前电池条的状态UIInterfaceOrientationorientation = [UIApplicationsharedApplication].statusBarOrientation;通过这个办法,你可以知道当前屏幕的电池条的显示方向,而且你还可以强制设置他的显示方向,通过设置这个属性就OK了,可以选择是否动画改变电池条方向。有了这两个那我们就可以任意的改变我们想要的显示方式了。
1.获取当前电池条的方向UIInterfaceOrientation orientation = [UIApplicationsharedApplication].statusBarOrientation
2.获取当前屏幕的大小CGRect frame = [UIScreenmainScreen].applicationFrame;
3.设置我们的View的中心点
CGPointcenter = CGPointMake(frame.origin.x + ceil(frame.size.width/2),frame.origin.y + ceil(frame.size.height/2));
4.根据当前电池条的方向,获取需要旋转的角度的大小。通常
if (orientation == UIInterfaceOrientationLandscapeLeft) {
return CGAffineTransformMakeRotation(M_PI*1.5);
} else if(orientation == UIInterfaceOrientationLandscapeRight) {
return CGAffineTransformMakeRotation(M_PI/2);
} else if(orientation == UIInterfaceOrientationPortraitUpsideDown){
return CGAffineTransformMakeRotation(-M_PI);
} else{
return CGAffineTransformIdentity;
}
5.可以动画的改变我们view的显示方式了
[[UIApplication sharedApplication]setStatusBarOrientation:UIDeviceOrientationLandscapeRightanimated:YES];
CGFloat duration = [UIApplicationsharedApplication].statusBarOrientationAnimationDuration;(获取当前电池条动画改变的时间)
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:duration];
//在这里设置view.transform需要匹配的旋转角度的大小就可以了。
[UIView commitAnimations];
以上是转自http://blog.csdn.net/starryheavens/article/details/8083644 的内容,虽然代码有点儿问题,但是那种思路是正确的。
按照以上的思路,在iOS6.0以前还要使 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation函数返回YES,才能实现屏幕的强制旋转。而且此时屏幕的强制旋转与屏幕的重力感应旋转可以自由切换。
在iOS6.0中,要使-(BOOL)shouldAutorotate返回YES,而且(必须)要使- (NSUInteger)supportedInterfaceOrientations方法返回0(这是关键)才能使屏幕强制旋转到你指定的方向。但是这就出现了一个问题,由于在iOS6.0中,要使屏幕响应重力感应的旋转,那么- (NSUInteger)supportedInterfaceOrientations函数要返回非零值,这样就使得屏幕重力感应的旋转与强制旋转两种效果不能兼得。
iPhone屏幕旋转机制详解相关推荐
- Android 系统(199)---Android事件分发机制详解
Android事件分发机制详解 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析. ...
- NodeMCU-ESP8266使用TFT_eSPI库驱动IC为ST7735的1.44寸TFT屏幕(TFT_eSPI详解)
文章目录 1. TFT_eSPI 驱动TFT屏幕 2. TFT_eSPI详解 2.1 文件配置 2.2 类.常用函数 2.1.1 TFT_eSPI类 2.1.2 Sprite 类 3. OVERLAP ...
- fgo服务器维护后抽奖,fgo:抽卡机制详解 彩圈是必定会出五星的
原标题:fgo:抽卡机制详解 彩圈是必定会出五星的 介于春节期间,不少玩家手头都很富裕,所以对于fgo的卡池方面的投入也是非常多的,而一个很现实与实际的问题就摆在了不少玩家面前,fgo的游戏抽卡机制到 ...
- View的事件体系之三 android事件分发机制详解(下)
接着上一篇来分析事件分发机制,在看了各位大牛的关于事件分发机制的分析后茅塞顿开,之前看过好几遍郭霖,弘扬以及玉刚大神关于事件体系的讲解,一直看不懂,比较模糊,最近复习时,看到一篇博文,写的相当精彩,看 ...
- 安卓自定义View进阶-事件分发机制详解
原文地址:http://www.gcssloop.com/customview/dispatch-touchevent-source Android 事件分发机制详解,在上一篇文章 事件分发机制原理 ...
- Binder机制详解(一)
系列目录 Binder机制详解(二) Binder机制详解(三) 文章目录 前言 一.爱情例子 1.普通Linux间进程通信方式 2.接着讲爱情的例子(Binder的实现机制) 3.Binder少拷贝 ...
- OpenGL的glRotatef旋转变换函数详解
OpenGL的glRotatef旋转变换函数详解 先看一下函数定义: void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfl ...
- PHP autoload机制详解
PHP autoload机制详解 转载自 jeakccc PHP autoload机制详解 (1) autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个 ...
- 模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配
先从纯文本搜索讲起,这是最基本也是最重要的. 从这篇开始,以及接下来连续几篇文章,都会介绍搜索的基础功能.注意,这几篇文章中谈论的都是基本的.正常的搜索功能,暂时不考虑Bug等因素. 在很多软件(例如 ...
最新文章
- 高速流水线,Jenkins Shared Pipeline
- matlab如何绘制三维隐函数?
- jvm性能调优实战 -51修复栈内存区域内存溢出问题 StackOverFlow
- Kafka使用遇到的坑
- 2014-11-25nbsp;11:26
- g开头的C语言编程软件,C语言函数大全(g开头)
- linux shell读取配置文件中的内容
- 08.QT中sqlite3数据库基本操作
- sqlserver数据库分组查询
- rp软件app流程图_Axure制作流程图的图文操作
- 【Missing separate debuginfos, use: debuginfo-install glibc-2.17-222.el7.x86_64】 解决方法
- matlab香农编码,用MATLAB编程实现香农编码.doc
- 解析《富爸爸财务自由之路》
- 天然气压缩因子计算软件_为什么测量天然气选择气体涡轮流量计?
- 毕业论文的页眉、页脚以及参考文献插入经验分享
- android3d地图,百度地图Android版 新增卫星图及3D模式
- 几个创业小故事的启示
- linux 计算标准差,shell计算均值和标准差的工具:datamash
- 倍福--运动中修改速度
- 【生产调度】基于遗传算法求解柔性生产调度(FJSP)问题含Matlab源码