UIView 的Transform属性以及 CGAffineTransform的使用
什么是Transform?
Transform是一个3×3的矩阵,如下图所示:
通过这个矩阵我们可以对一个坐标系统进行缩放,平移,旋转以及这两者的任意组着操作。而且矩阵的操作不具备交换律,即矩阵的操作的顺序不同会导致不同的结果。UIView有个transform的属性,通过设置该属性,我们可以实现调整该view在其superView中的大小和位置。
矩阵实现坐标变化背后的数学知识:
常用的三种实现选中的方式:
// 实现的是放大和缩小
view.transform=CGAffineTransformScale(view.transform, 0.5, 0.5);
//实现的是旋转
view.transform=CGAffineTransformRotate(view.transform, 0.2);
//实现的是平移
view.transform=CGAffineTransformTranslate(view.transform, 20, 20);
关于 View.transform = CGAffineTransformIdentity .
如果我们在为一个view设置了多个CGAffineTransform, 那么每一个CGAffineTransform都以在上一个CGAffineTransform运行完后的位置的center作为参照点运行的.
如果我们在每一个CGAffineTransform运行前加一句:
View.transform = CGAffineTransformIdentity
那么会先把view恢复到原始的没有CGAffineTransform运行过得状态, 然后再运行CGAffineTransform.
这样就相当于, 每一个CGAffineTransform运行前, view都会先归位. 然后再运行. 所以没有CGAffineTransform都是以view的原始位置为参考, 互不影响.我们也可以在进行了一系列CGAffineTransform后 通过View.transform = CGAffineTransformIdentity 来让view回到原始状态
有的时候我们需要吧多个CGAffineTransform效果合并一起执行, 那么需要用CGAffineTransformConcat(transT, transS);他会将两个效果合到一起执行,但是需要注意CGAffineTransformConcat(transT, transS)和CGAffineTransformConcat(transS, transT)的实际效果未必一样, 请务必注意.
二、CGAffineTransformMakeTranslation和CGAffineTransformTranslate、CGAffineTransformMakeScale和CGAffineTransformScale、还有CGAffineTransformMakeRotation和CGAffineTransformRotation的区别。
这个我们举个例子来说,
UIButton *Btn1 = [[UIButton alloc] initWithFrame:CGRectMake(, , , )];
由此我们知道,Btn1的frame是从(0, 200);中心center的位置是(60, 220);
所以执行下:
Btn1.transform = CGAffineTransformMakeTranslation(, );
这是Btn1的中心位置变成了(220, 220).frame为(160, 200, 220, 220)
如果执行:
Btn1.transform = CGAffineTransformTranslation(CGAffineTransformMakeTranslation(, ),,),
说明是先执行了 CGAffineTransformMakeTranslation(160, 0),然后又执行了(20, 0).中心位置变为(240, 220), frame变为(180, 200, 240, 220)。
所以CGAffineTransformTranslation(CGAffineTransformMakeTranslation(160, 0),20,0) = CGAffineTransformMakeTranslation(180, 0)是等价的
同理其它两种的属性。
最后对 CGAffineTransformMake(a,b,c,d,x,y)6个参数可以一次的设置旋转、缩放、移位。
2、《UIView的transform属性以及 CGAffineTransform的使用》
最新文章
- TaintDroid剖析之DVM变量级污点跟踪(下篇)
- Delphi的文件操作
- T4模板之初体验(语法)
- Python基本语句
- 卡通投掷游戏ios源码
- python isinstance 判断各种类型的小细节
- 绑定事件导致发送多个ajax请求的问题
- Hadoop安装(2)安装hadoop 前的centos 设置
- Java缓存类的实际应用场景
- delphi 微信(WeChat)多开源代码
- rocketmq 发送时异常:system busy 和 broker busy 解决方案
- 详解 清除浮动 的多种方式(clearfix)
- Lab 7-1
- 标准遗传算法(二进制编码 python实现)
- Android View 深度分析requestLayout、invalidate与postInvalidate
- cocos2d-x(十一)Lua开发飞机大战-6-加入子弹
- posix_memalign详细解释(转)——自定义对齐大小的内存分配函数
- (转)调优 DB2 UDB v8.1 及其数据库的最佳实践
- Mining Your Own Business UVALive - 5135(点双联通分量)
- C++中stringstream样例
热门文章
- day27(027-反射&;JDK新特性)
- 好文推荐:终于有人把Elasticsearch原理讲透了
- POJ 3911:Internet Service Providers
- ubuntu16+caffe fast-rcnnCPU运行步骤
- MySQL中间件介绍
- mysql分组和排序操作
- 使用java(jdbc)向mysql中添加数据时出现“unknown column……”错误
- Mac系统的SVN客户端:Snail SVN 精简版
- C语言获取本机ip
- 题解 P1829 【[国家集训队]Crash的数字表格 / JZPTAB】