iOS中的仿射变换

在开发中我们有时需要对视图做旋转和缩放,iOS提供了三种仿射变换:平移、旋转、和缩放。

一、仿射变换

每个仿射变换可以由一个矩阵A和一个向量b给出,它可以写作A和一个附加的列b。一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法。

CGAffineTransform结构体

struct CGAffineTransform {
  CGFloat a, b, c, d;
  CGFloat tx, ty;
};

CGAffineTransform实际上是一个矩阵

| a,  b,  0 |
| c,  d,  0 |
| tx, ty, 1 |

这个矩阵是用来标记这个View的变化,可以是旋转,缩放,平移。
也就是说,View的坐标为 {x,y},变化后的坐标是{x’,y’}

                    | a,  b,  0 |
{x',y',1}={x,y,1} x | c,  d,  0 |
                    | tx, ty, 1 |

二、创建Transformations

1、直接创 建

使用CGAffineTransformMake函数

CGAffineTransform CGAffineTransformMake (
   CGFloat a,
   CGFloat b,
   CGFloat c,
   CGFloat d,
   CGFloat tx,
   CGFloat ty
   );

参数比较多,很少使用。

2、创建缩放变换

使用CGAffineTransformMakeScale函数

CGAffineTransform CGAffineTransformMakeScale (CGFloat sx, CGFloat sy);

sx为宽度缩放因子,sy为高度缩放因子。假设是一个图片视图引用了这个变换,那么图片的宽度就会变为 width*sx ,对应高度变为 hight * sy。

3、创建旋转变换

使用CGAffineTransformMakeRotation函数

CGAffineTransform CGAffineTransformMakeRotation ( CGFloat angle);

以弧度为参数,表示要旋转的度数。

4、创建平移变换

使用CGAffineTransformMakeTranslation函数

CGAffineTransform CGAffineTransformMakeTranslation (CGFloat tx,CGFloat ty);

设置一个视图的transform属性,那么它的起始位置 x 会加上tx , y 会加上 ty

三、修改Transformations

1、对传入的变换加上平移

CGAffineTransformTranslate

CGAffineTransform CGAffineTransformTranslate (
    CGAffineTransform t,
    CGFloat tx,
    CGFloat ty
 );

2、对传入的变换加上缩放

CGAffineTransformScale

CGAffineTransform CGAffineTransformScale (
    CGAffineTransform t,
    CGFloat sx,
    CGFloat sy
);

3、对传入的变换加上旋转

CGAffineTransformRotate

CGAffineTransform CGAffineTransformRotate (
    CGAffineTransform t,
    CGFloat angle
);

4、反转传入的变换

CGAffineTransformInvert

CGAffineTransform CGAffineTransformInvert (CGAffineTransform t);

5、合并两个变换

CGAffineTransformConcat

CGAffineTransform CGAffineTransformConcat (CGAffineTransform t1, CGAffineTransform t2);

返回一个由 t1 和 t2 合并而成的Transformation