什么是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个参数可以一次的设置旋转、缩放、移位。

参考文章:1、《CGAffineTransformMakeTranslation和CGAffineTransformTranslate、CGAffineTransformScale和CGAffineTransform》

     2、《UIView的transform属性以及 CGAffineTransform的使用》

最新文章

  1. TaintDroid剖析之DVM变量级污点跟踪(下篇)
  2. Delphi的文件操作
  3. T4模板之初体验(语法)
  4. Python基本语句
  5. 卡通投掷游戏ios源码
  6. python isinstance 判断各种类型的小细节
  7. 绑定事件导致发送多个ajax请求的问题
  8. Hadoop安装(2)安装hadoop 前的centos 设置
  9. Java缓存类的实际应用场景
  10. delphi 微信(WeChat)多开源代码
  11. rocketmq 发送时异常:system busy 和 broker busy 解决方案
  12. 详解 清除浮动 的多种方式(clearfix)
  13. Lab 7-1
  14. 标准遗传算法(二进制编码 python实现)
  15. Android View 深度分析requestLayout、invalidate与postInvalidate
  16. cocos2d-x(十一)Lua开发飞机大战-6-加入子弹
  17. posix_memalign详细解释(转)——自定义对齐大小的内存分配函数
  18. (转)调优 DB2 UDB v8.1 及其数据库的最佳实践
  19. Mining Your Own Business UVALive - 5135(点双联通分量)
  20. C++中stringstream样例

热门文章

  1. day27(027-反射&JDK新特性)
  2. 好文推荐:终于有人把Elasticsearch原理讲透了
  3. POJ 3911:Internet Service Providers
  4. ubuntu16+caffe fast-rcnnCPU运行步骤
  5. MySQL中间件介绍
  6. mysql分组和排序操作
  7. 使用java(jdbc)向mysql中添加数据时出现“unknown column……”错误
  8. Mac系统的SVN客户端:Snail SVN 精简版
  9. C语言获取本机ip
  10. 题解 P1829 【[国家集训队]Crash的数字表格 / JZPTAB】