仿射变换(CGAffineTransform)使用小结

一、理论基础

在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射由一个线性变换(运用一次函数进行的变换)接上一个平移组成。

CGAffineTransform简单分析(http://xummer26.com/blog/CGAffineTransform-simple-analysis.html)

二、射变换的种类

1.自定义变换

_demoView.transform = CGAffineTransformIdentity;
[UIView animateWithDuration:1.5f animations:^{
    _demoView.transform = CGAffineTransformMake(1.0, 0, 0, 1.0, 20, 20);
}];

2.平移

 x > 0 右边  x < 0 左边
 y > 0 下边  y < 0 上边 
 _demoView.transform = CGAffineTransformIdentity;
[UIView animateWithDuration:1.5f animations:^{
    _demoView.transform = CGAffineTransformMakeTranslation(100, -50);
}];

3.缩放 x 轴缩放 , y 轴缩放

_demoView.transform = CGAffineTransformIdentity;
[UIView animateWithDuration:1.5f animations:^{
    _demoView.transform = CGAffineTransformMakeScale(2, 0.5);
}];

4.旋转 angle > 0 顺时针 , angle < 0逆时针

_demoView.transform = CGAffineTransformIdentity;
[UIView animateWithDuration:1.5f animations:^{
   _demoView.transform = CGAffineTransformMakeRotation(20);
}];

5.旋转 + 平移

_demoView.transform = CGAffineTransformIdentity;
[UIView animateWithDuration:1.5f animations:^{
    _demoView.transform = CGAffineTransformMakeRotation(20);
}];
[UIView animateWithDuration:1.5f animations:^{
    _demoView.transform = CGAffineTransformTranslate(_demoView.transform, 150, 150);
}];

6.旋转 + 缩放

_demoView.transform = CGAffineTransformIdentity;
[UIView animateWithDuration:1.5f animations:^{
    _demoView.transform = CGAffineTransformMakeRotation(20);
    //        NSLog(@"%d", CGAffineTransformIsIdentity(_demoView.transform));
}];
[UIView animateWithDuration:1.5f animations:^{
    _demoView.transform = CGAffineTransformScale(_demoView.transform, 0.5, 2);
    //        NSLog(@"%d", CGAffineTransformIsIdentity(_demoView.transform));
}];

7.相反 (逆旋转,逆移动等)

_demoView.transform = CGAffineTransformIdentity;
[UIView animateWithDuration:1.5f animations:^{
    _demoView.transform = CGAffineTransformInvert(CGAffineTransformMakeRotation(20));
}];

8.合并多个变换

_demoView.transform = CGAffineTransformIdentity;
[UIView animateWithDuration:1.5f animations:^{
    _demoView.transform = CGAffineTransformConcat(CGAffineTransformMakeRotation(20), CGAffineTransformScale(_demoView.transform, 0.5, 2));
    NSLog(@"%d", CGAffineTransformEqualToTransform(CGAffineTransformMakeRotation(20), CGAffineTransformScale(_demoView.transform, 0.5, 2)));
}];

三、补充

CGAffineTransformIdentity : 单位矩阵变换,一般用于仿射变换的初始化或者还原。
CGAffineTransformEqualToTransform(CGAffineTransform t1, CGAffineTransform t2) : 判断两个变换矩阵是否相等
CGAffineTransformConcat(CGAffineTransform t1, CGAffineTransform t2) : 得到两个矩阵相加后得到的最终矩阵
CGPoint CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t) : 某点通过矩阵变换之后的点
CGSize CGSizeApplyAffineTransform(CGSize size, CGAffineTransform t) : 某个size通过矩阵变换之后的size
CGRect CGRectApplyAffineTransform(CGRect rect, CGAffineTransform t) : 某个Rect通过矩阵变换之后的区域