CGAffineTransform
UIView 的 transform 属性是一 个 CGAffineTransform 类型,用于在二维空间做旋转,缩放和平移。 CGAffineTransform 是一个可以和二维空间向量(例如 的3X2的矩阵)
原理如下:
用 CGPoint 的每一列和 CGAffineTransform 矩阵的每一行对应元素相乘再求 和,就形成了一个新的 CGPoint 类型的结果。要解释一下图中显示的灰色元素, 为了能让矩阵做乘法,左边矩阵的列数一定要和右边矩阵的行数个数相同,所以要 给矩阵填充一些标志值,使得既可以让矩阵做乘法,又不改变运算结果,并且没必 要存储这些添加的值,因为它们的值不会发生变化,但是要用来做运算
矩阵乘法结果为:x’ = ax + cy + tx y’ = bx + dy + ty
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)平移的话,只要加tx,ty,x’, y’变化,所以坐标变化。
默认值 CGAffineTransformMake(1, 0, 0, 1, tx, ty)
旋转和缩放原理相同
-
创建一个 CGAffineTransform 实例:
CGAffineTransformMakeRotation(CGFloat angle)
实现以初始位置为基准,将坐标系统逆时针旋转angle弧度(弧度=π/180×角度,M_PI弧度代表180角度)CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
实现以初始位置为基准,在x轴方向上缩放x倍,在y轴方向上缩放y倍
注 : 当sx为正值时,会在x轴方向上缩放x倍,反之,则在缩放的基础上沿着竖直线翻转;当sy为正值时,会在y轴方向上缩放y倍,反之,则在缩放的基础上沿着水平线翻转CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)
实现以初始位置为基准,在x轴方向上平移x单位,在y轴方向上平移y单位
如果tx或ty为负值就是向反方向平移
UIView的变换可以通过设置transform属性做变换,但实际上它只是封装了内部图层
CALayer同样也有一个transform属性,但它的类型是 CATransform3D
CALayer 对应于UIView的transform属性叫做 affineTransform
复合变换
当操纵一个变换的时候,初始生成一个什么都不做的变换很重要,也就是创建一 个 CGAffineTransform 类型的空值,矩阵论中称作单位矩阵
CGAffineTransform transform = CGAffineTransformIdentity
- (void)viewDidLoad
{
[super viewDidLoad];
//create a new transform
CGAffineTransform transform = CGAffineTransformIdentity;
//scale by 50%
transform = CGAffineTransformScale(transform, 0.5, 0.5);
//rotate by 30 degrees
transform = CGAffineTransformRotate(transform, M_PI / 180.0 * 30.0);
//translate by 200 points
transform = CGAffineTransformTranslate(transform, 200, 0);
//apply transform to layer
self.layerView.layer.affineTransform = transform;
}
以上就实现了连续三个变换