天天看点

ios动画系列 -- UIView的transform

制作动画时UIView和CALayer的transform是最常用的属性。通过对这个属性的操作,可以很方便的改变对象的大小,方向,位置。不同的是UIView操作的是3x3的matrix,而CALayer的是4x4的。

matrix的结构如下

[a, b, 0]
[c, d, 0]
[tx,ty,1]
           

第3列的数值一直是(0,0,1),矩阵转换只用到前2列

矩阵如何转换成坐标值呢?比如一个_button的frame值是(24,50,100,100), 默认矩阵值为CGAffineTransformIdentity

[1, 0, 0]
[0, 1, 0]
[0, 0, 1]
           
X1 = ax + cy + tx = 24 * 1 + 50 * 0 + 0 = 24;
Y1 = bx + dy + ty = 24 * 0 + 50 * 1 + 0 = 50;  
           

现在向右平移20,再向下平移30要怎么做呢?

_button.transform = CGAffineTransformMakeTranslation(20, 30);
//返回的结构如下
[1, 0, 0]
[0, 1, 0]
[20, 30, 1]
           

移动需要改变tx, ty。

接下来宽放大1.5倍,高放大1.4倍

_button.transform = CGAffineTransformMakeScale(1.5f, 1.4f);
//返回的矩阵结构如下
[1.5f, 0, 0]
[0, 1.4f, 0]
[0, 0, 0]
           

缩放需要改变a, d  正数放大,负数缩小。

旋转90度

_button.transform = CGAffineTransformMakeRotation(M_PI / 2);
//返回的矩阵结构如下
[cosA, sinA, 0]
[-sinA, cosA, 0]
[0, 0, 1]
           

旋转需要改变a, b, c, d。顺便提一下弧度值的计算方法

360 = 2 * 3.14(PAI);

180 = 3.14(PAI);

正弧度逆时钟旋转,负弧度顺时钟旋转

以上就是矩阵的基本操作方法,transform属性的说明就到这里。

如果要实现动画可以使用BeginAnimations和commitAnimations来控制