iTouch,iPhone,iPad设置都是支持旋转的,如果我们的程序能够根据不同的方向做出不同的布局,体验会更好。

  如何设置程序支持旋转呢,通常我们会在程序的info.plist中进行设置Supported interface orientations,添加我们程序要支持的方向,而且程序里面每个viewController也有方法

  supportedInterfaceOrientations(6.0及以后)

  shouldAutorotateToInterfaceOrientation(6.0之前的系统)

  通过viewController的这些方法,我们可以做到更小粒度的旋转控制,如程序中仅仅允许个别界面旋转。

一、屏幕旋转背后到底做了什么呢?

  下面我们看个简单的例子,用xcode新建一个默认的单视图工程,然后在对应viewController的响应旋转后的函数中输出一下当前view的信息,代码如下:

  SvRotateViewController.m//  SvRotateByTransform  Created by  maple on 4/21/13.//  Copyright (c) 2013 maple. All rights reserved.//#import "SvRotateViewController.h"@interface SvRotateViewController ()@end@implementation SvRotateViewController- (void)viewDidLoad{    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.        self.view.backgroundColor = [UIColor grayColor];}- (void)didReceiveMemoryWarning{    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{    return YES;}- (BOOL)shouldAutorotate{    return YES;}- (NSUInteger)supportedInterfaceOrientations{    return UIInterfaceOrientationMaskAll;}- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{    NSLog(@"UIViewController will rotate to Orientation: %d", toInterfaceOrientation);}- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{    NSLog(@"did rotated to new Orientation, view Information %@", self.view);}@end

  查看代码我们可以发现,我们的viewController支持四个方向,然后在旋转完成的didRotateFromInterfaceOrientation函数中打印了self.view的信息,旋转一圈我们可以看到如下输出:

  设备的初始方向是UIInterfaceOrientationPortrait的,然后顺时针依次经过LandscapeLeft,PortraitUpsideDown,LandscapeRight,最后再回到UIInterfaceOrientationPortrait方向。仔细看的话我们会发现在旋转的过程中,除了frame之外,Transform也在一直变化。观察frame发现,它的变化应该是由于系统的状态栏引起的。于是将系统状态栏隐藏掉,在输出发现frame果然不再变化。因此我们可以怀疑屏幕旋转是通过变化Transform实现的。

二、什么是Transform

  Transform(变化矩阵)是一种3×3的矩阵,如下图所示:

  通过这个矩阵我们可以对一个坐标系统进行缩放,平移,旋转以及这两者的任意组着操作。而且矩阵的操作不具备交换律,即矩阵的操作的顺序不同会导致不同的结果。UIView有个transform的属性,通过设置该属性,我们可以实现调整该view在其superView中的大小和位置。

  矩阵实现坐标变化背后的数学知识:

  设x,y分别代表在原坐标系统中的位置,x’,y’代表通过矩阵变化以后在新的系统中的位置。其中式1就是矩阵变化的公式,对式1进行展开以后就可以得到式2。从式2我们可以清楚的看到(x,y)到(x’,y’)的变化关系。

  1)当c,b,tx,ty都为零时,x’ = ax,y’ = by;即a,d就分别代表代表x,y方向上放大的比例;当a,d都为1时,x’ = x,y’ = y;这个时候这个矩阵也就是传说中的CGAffineTransformIdentity(标准矩阵)。

  2)当a,d为1,c,d为零的时候,x’ = x + tx,y’ = y + ty;即tx,ty分别代表x,y方向上的平移距离。

  3)前面两种情况就可以实现缩放和平移了,那么旋转如何表示呢?

  假设不做平移和缩放操作,那么从原坐标系中的一点(x,y)旋转α°以后到了新的坐标系中的一点(x’,y’),那么旋转矩阵如下:

  

  展开以后就是x’ = xcosα – ysinα,y’ = xsinα + ycosα;

  实际应用中,我们将这些变化综合起来,即可完成所有二维的矩阵变化。现在我们在回过头来看看前面设备旋转时的输出,当设备位于Portrait的时候由于矩阵是标准矩阵,所以没有进行打印。当转到UIInterfaceOrientationLandscapeLeft方向的时候,我们的设备是顺时针转了90°,这个时候矩阵应该是(cos90°,sin90°,-sin90°,cos90°,tx,ty),由于未进行平移操作所以tx,ty都为0,刚好可以跟我们控制台输出:”<UIView: 0×8075390; frame = (0 0; 320 480); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0×8074980>>“一致。观察其他两个方向的输出,发现结果均和分析一致。

  由此可以发现屏幕旋转其实就是通过view的矩阵变化实现,当设备监测到旋转的时候,会通知当前程序,当前程序再通知程序中的window,window会通知它的rootViewController的,rootViewController对其view的transform进行设置,最终完成旋转。

  如果我们直接将一个view添加到window上,系统将不会帮助我们完成旋操作,这个时候我们就需要自己设置该view的transform来实现旋转了。这种情况虽然比较少,但是也存在的,例如现在很多App做的利用状态栏进行消息提示的功能就是利用自己创建window并且自己设置transform来完成旋转支持的,下一篇博客会介绍如何实现这种消息通知。

  注:转载请注明出处!欢迎大家加我QQ 1592232964,一起讨论共同进步。

IOS:屏幕旋转与Transform相关推荐

  1. iOS 屏幕旋转问题总结

    1.两个Orientation 1.1设备的物理方向(UIDeviceOrientation) typedef NS_ENUM(NSInteger, UIDeviceOrientation) {UID ...

  2. ios屏幕旋转学习笔记

    加速计是整个IOS屏幕旋转的基础,依赖加速计,设备才可以判断出当前的设备方向,IOS系统共定义了以下七种设备方向: typedef NS_ENUM(NSInteger, UIDeviceOrienta ...

  3. iOS屏幕旋转 浅析

    一.两种orientation 了解屏幕旋转首先需要区分两种orientation 1.device orientation 设备的物理方向,由类型UIDeviceOrientation表示,当前设备 ...

  4. IOS 屏幕旋转Orientation总结

    IOS Orientation, 想怎么转就怎么转~~~ 此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. 博客: htt ...

  5. html 屏幕旋转,屏幕旋转与Transform

    iTouch,iPhone,iPad设置都是支持旋转的,如果我们的程序能够根据不同的方向做出不同的布局,体验会更好. 如何设置程序支持旋转呢,通常我们会在程序的info.plist中进行设置Suppo ...

  6. iOS屏幕旋转及其基本适配方法

    屏幕旋转示例.jpeg 前段时间抽空总结了一下iOS视频播放的基本用法,发现这其中还有一个我们无法绕过的问题,那就是播放界面的旋转与适配.的确,视频播放与游戏类型的App经常会遇到这个的问题.由于至今 ...

  7. iOS屏幕旋转那些事

    前些日子处理了一些关于页面中的屏幕旋转的事情,需要根据某个页面的不同旋转方向去做不同的处理,现在再次总结一下,以在心里有个系统的体系,也可以当成工具文章查询. 首先来看第一个方法: [UIDevice ...

  8. iOS屏幕旋转技术点及解决方案总结

    1.屏幕旋转相关枚举 关于屏幕旋转枚举一共有3种: UIInterfaceOrientation,    UIInterfaceOrientationMask,   UIDeviceOrientati ...

  9. IOS屏幕旋转的检测 与 强行切换

    mark – 屏幕的手动切换 [[UIDevice currentDevice]setValue:[NSNumber numberWithInteger:UIDeviceOrientationLand ...

最新文章

  1. MTU(最大传输单元)
  2. q160问题,www.q160.com,ie被篡改
  3. 浅入“Block Formatting Context”
  4. 数学建模学习笔记——模糊综合评价模型(评价类,发放问卷一般不用)
  5. 控制ALV单元格可编辑
  6. 元神一直显示连接服务器失败,原神连接服务器失败是什么情况-提示连接服务器失败处理办法-去秀手游网...
  7. AJPFX讲解Java 性能优化[4]:关于 finalize 函数
  8. 用计算路由的方法优化BI后台性能
  9. 20.案例实战:为@Async实现一个自定义线程池
  10. 计算机数值方法(1):引论
  11. GRUB和LILO的区别
  12. mysql 单表 子查询_04 数据库入门学习-单表查询、多表查询、子查询(示例代码)...
  13. 华为新机预装鸿蒙,华为新机来了!预装鸿蒙OS,搭载麒麟9000
  14. 3an推客CPC怎么设置?3an推客推广效果怎么样
  15. 堆和栈得区别--向WXP学习
  16. 《区块链技术驱动金融》读书笔记
  17. 电商购物平台——书籍管理系统Java贯穿项目图形用户界面
  18. unity背景设置透明,显示ios原生ui背景
  19. JS中冒泡排序从小到大以及从大到小
  20. android加载ftp图片,按键安卓版网络访问之 图片处理,FTP,HTTP 实现

热门文章

  1. 复杂订单流程的梳理小结
  2. 一日一技:别怕,我们的聊天消息,没人能偷看
  3. 自我介绍PPT模板如何设计?
  4. CTFshow misc 入门
  5. ChatGPT有中文版吗?
  6. 聊聊授权那些事儿(ladon库)
  7. 第2章【思考与练习1】一维数组访问,在subjects数组中选择并显示序号1、2、4门课的名称。二维数组访问,选择并显示scores数组的1、4行。生成由整数10~19组成的2×5的二维数组
  8. 阿里健康开始第二波;得物取消996,厂有直呼总包少了17%;跟阿里高p聊天,时代的眼泪...
  9. 崔峥嵘的舞台与人生:霸气女高音 淡然贤淑女
  10. Git 命令提交代码