主要说一下本人对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屏幕旋转机制详解相关推荐

  1. Android 系统(199)---Android事件分发机制详解

    Android事件分发机制详解 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析. ...

  2. 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 ...

  3. fgo服务器维护后抽奖,fgo:抽卡机制详解 彩圈是必定会出五星的

    原标题:fgo:抽卡机制详解 彩圈是必定会出五星的 介于春节期间,不少玩家手头都很富裕,所以对于fgo的卡池方面的投入也是非常多的,而一个很现实与实际的问题就摆在了不少玩家面前,fgo的游戏抽卡机制到 ...

  4. View的事件体系之三 android事件分发机制详解(下)

    接着上一篇来分析事件分发机制,在看了各位大牛的关于事件分发机制的分析后茅塞顿开,之前看过好几遍郭霖,弘扬以及玉刚大神关于事件体系的讲解,一直看不懂,比较模糊,最近复习时,看到一篇博文,写的相当精彩,看 ...

  5. 安卓自定义View进阶-事件分发机制详解

    原文地址:http://www.gcssloop.com/customview/dispatch-touchevent-source Android 事件分发机制详解,在上一篇文章 事件分发机制原理  ...

  6. Binder机制详解(一)

    系列目录 Binder机制详解(二) Binder机制详解(三) 文章目录 前言 一.爱情例子 1.普通Linux间进程通信方式 2.接着讲爱情的例子(Binder的实现机制) 3.Binder少拷贝 ...

  7. OpenGL的glRotatef旋转变换函数详解

    OpenGL的glRotatef旋转变换函数详解 先看一下函数定义: void glRotatef(GLfloat angle,  GLfloat x,     GLfloat y,     GLfl ...

  8. PHP autoload机制详解

    PHP autoload机制详解 转载自 jeakccc PHP autoload机制详解 (1) autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个 ...

  9. 模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配

    先从纯文本搜索讲起,这是最基本也是最重要的. 从这篇开始,以及接下来连续几篇文章,都会介绍搜索的基础功能.注意,这几篇文章中谈论的都是基本的.正常的搜索功能,暂时不考虑Bug等因素. 在很多软件(例如 ...

最新文章

  1. 高速流水线,Jenkins Shared Pipeline
  2. matlab如何绘制三维隐函数?
  3. jvm性能调优实战 -51修复栈内存区域内存溢出问题 StackOverFlow
  4. Kafka使用遇到的坑
  5. 2014-11-25nbsp;11:26
  6. g开头的C语言编程软件,C语言函数大全(g开头)
  7. linux shell读取配置文件中的内容
  8. 08.QT中sqlite3数据库基本操作
  9. sqlserver数据库分组查询
  10. rp软件app流程图_Axure制作流程图的图文操作
  11. 【Missing separate debuginfos, use: debuginfo-install glibc-2.17-222.el7.x86_64】 解决方法
  12. matlab香农编码,用MATLAB编程实现香农编码.doc
  13. 解析《富爸爸财务自由之路》
  14. 天然气压缩因子计算软件_为什么测量天然气选择气体涡轮流量计?
  15. 毕业论文的页眉、页脚以及参考文献插入经验分享
  16. android3d地图,百度地图Android版 新增卫星图及3D模式
  17. 几个创业小故事的启示
  18. linux 计算标准差,shell计算均值和标准差的工具:datamash
  19. 倍福--运动中修改速度
  20. 【生产调度】基于遗传算法求解柔性生产调度(FJSP)问题含Matlab源码

热门文章

  1. python爬取微博热搜数据并保存!
  2. 浅谈二叉查找树、AVL树、红黑树、B树、B+树的原理及应用
  3. cmake整理:在编译时拷贝文件之add_custom_comand 和 add_custom_target
  4. ArcMap关联图层并发布为服务
  5. 解决小米手机安装失败(-108)错误
  6. BFC是什么?BFC可以做什么?
  7. 用计算机弹奏七月上,七月上歌词背后的故事 七月上背景故事介绍
  8. 程序员大佬都在用的代码编辑器,你不用就OUT啦
  9. intelx86为何从0xFFFF0处执行
  10. 茨威格为什么自杀(1942)?