关于CGAffineTransform苹果的定义是这样的
![](https://img.haomeiwen.com/i2470124/be2aff3fb8ff46f3.png)
- CGAffineTransform用于绘制2D图形的一个仿射变换矩阵
- 用于做旋转、缩放、平移,一个仿射变换矩阵 (是一个3*3的矩阵)
- 它采用的是二维坐标系( 即向右为x轴正方向,向下为y轴正方向)
![](https://img.haomeiwen.com/i1743362/a53ea9ae932d5ab4.png)
CGAffineTransform提供了这样一个函数
CGAffineTransform CGAffineTransformMake (CGFloat a,CGFloat b,CGFloat c,CGFloat d,CGFloat tx,CGFloat ty);
其中tx用来控制在x轴方向上的平移
ty用来控制在y轴方向上的平移
a用来控制在x轴方向上的缩放
d用来控制在y轴方向上的缩放
abcd共同控制旋转
为了把二维图形的旋转、缩放、平移变化统一在一个坐标系里,引入了齐次坐标的概念,即把一个图形用一个三维矩阵表示,其中第三列总是(0,0,1),用来作为坐标系的标准。所以所有的变化都由前两列完成.
矩阵算法公式:
![](https://img.haomeiwen.com/i143910/d52c70522fcffdc7.png)
说明: 原坐标设为(x,y,1);
![](https://img.haomeiwen.com/i2470124/09f93fdd868a01ad.png)
![](https://img.haomeiwen.com/i143910/681dd88ca990f054.png)
上图中的tx 和ty 记做 t小x ,t小y
|a b 0|
[x,y,1] |c d 0| = [ax+cy+t小x bx+dy+t小y 1] ;
|tx ty 1 |
通过矩阵运算后的坐标[ax+cy+t小x bx+dy+t小y 1]
看个栗子
我修改第二个View的transform中a的值为0.2:
创建两个同样大小宽高都是100位置相同的View,上面的为天蓝色,下面是草绿色,修改天蓝色视图的transform中a的值为0.3 d的值为 0.5 即CGAffineTransformMake(0.2,0,0,0.5,0,0);
![](https://img.haomeiwen.com/i2470124/5c52c4b568512ec9.png)
![](https://img.haomeiwen.com/i2470124/b8b4c0b5f0eb709c.png)
因为a和d是控制缩放,所以根据矩阵公式计算
x` = ax + cy + t小x = 0.5 * 100 + 0 * 100 + 0 = 50
y` = bx + dy + t.y = 0 * 100 + 0.5 * 100 + 0 = 50
- x按照a值进行了比例缩放
- y按照d的值进行比列缩放
- 最重要的是缩放的过程中View的point(中心点)是不会改变的
看下平移 CGAffineTransformMake(0.5,0,0,0.5,50,50)
![](https://img.haomeiwen.com/i2470124/400219d642c8d477.png)
- 当tx为正值时,会向x轴正方向平移 (向右),反之,则向x轴负方向平移(向左)
- 当ty为正值时,会向y轴正方向平移(向下),反之,则向y轴负方向平移(向上)
看一下旋转
先看下这个函数
CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)
- 该函数实现以初始位置为基准,将坐标系统逆时针旋转
angle弧度
- 弧度计算公式: 弧度=π/180 × 角度
- 程序中 M_PI = π
- M_PI弧度 =》代表180角度 (180度)
CGAffineTransformMakeRotation(M_PI * 0.25)
因为M_PI弧度 表示180度
所以(M_PI * 0.25)弧度 45度
所以(M_PI * 0.25)逆时针旋转(M_PI * 0.25)弧度就等于 逆时针旋转45度
![](https://img.haomeiwen.com/i2470124/7c65b51a8ff79d53.png)
CGAffineTransformRotate实现以一个已经存在的形变为基准,将坐标系统逆时针旋转angle弧度(弧度=π/180×角度,M_PI弧度代表180角度)
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI*0.25);
self.demoImageView.transform = CGAffineTransformRotate(transform, M_PI*0.25);
transform属性默认值为CGAffineTransformIdentity,可以在形变之后设置该值以还原到最初状态
旋转公式 : t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ]
CGAffineTransformMake(cos(M_PI * 0.25), sin(M_PI * 0.25), -sin(M_PI * 0.25), cos(M_PI * 0.25), 0, 0)
![](https://img.haomeiwen.com/i2470124/75bca2fc3cca1fc7.png)
网友评论