本文章学习于这两篇优秀博客:
http://www.cnblogs.com/smileEvday/archive/2013/04/23/Rotate1.html (推荐)
http://www.cocoachina.com/industry/20121126/5178.html
在UIView中有一个扩展的属性:CGAffineTransform
@property(nonatomic) CGAffineTransform transform; // default is CGAffineTransformIdentity. animatable
查看官方文档可以知道,以上的参数其实是一个叫变换矩阵(Affine Transformation Matrix)的各组成部分:
并且该类型有一个方括号的表示形式: [ a, b, c, d, tx, ty ]
而假设原始的坐标系统值 和 变换后的坐标系统值分别如下:
而变换矩阵充当的变换公式如下:
显而易见,变换关系如下;
而官方文档说的:rotate,scale,translate,or skew该如何体现的呢?
1)当c,b,tx,ty都为零时,x' = ax,y' = by;即a,d就分别代表代表x,y方向上放大的比例;当a,d都为1时,x' = x,y' = y;这个时候这个矩阵也就是传说中的CGAffineTransformIdentity(标准矩阵)。
2)当a,d为1,c,b为零的时候,x' = x + tx,y' = y + ty;即tx,ty分别代表x,y方向上的平移距离(tx, ty都是常数)
3)联想起初中高中坐标系的旋转一个非常重要的工具,对了就是cos(angle) sin(angle) 这两个角度相关的值,如果变换矩阵如下:
而变换关系理所当然如下:
如何旋转也相当明显了吧!
4)除了以上的关系,任意的组成便可以形成所说的各种图形操作
不累加的定值操作:
平移操作:
/* Return a transform which translates by `(tx, ty)':
t' = [ 1 0 0 1 tx ty ] */
CG_EXTERN CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,
CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
缩放操作:
/* Return a transform which scales by `(sx, sy)':
t' = [ sx 0 0 sy 0 0 ] */
CG_EXTERN CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
旋转操作:
/* Return a transform which rotates by `angle' radians:
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] */
CG_EXTERN CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
累加的、在原有基础上的操作:
平移属性:
/* Translate `t' by `(tx, ty)' and return the result:
t' = [ 1 0 0 1 tx ty ] * t */
CG_EXTERN CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t,
CGFloat tx, CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
缩放属性:
/* Scale `t' by `(sx, sy)' and return the result:
t' = [ sx 0 0 sy 0 0 ] * t */
CG_EXTERN CGAffineTransform CGAffineTransformScale(CGAffineTransform t,
CGFloat sx, CGFloat sy) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
旋转属性:
/* Rotate `t' by `angle' radians and return the result:
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] * t */
CG_EXTERN CGAffineTransform CGAffineTransformRotate(CGAffineTransform t,
CGFloat angle) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
关于它们的使用也是异常简单,只是要注意上面的是在一个定制值上面做的操作,而下面是累加的操作,例如:
平移:
//只能平移一次到(50, 200)这个位置
self.headImageView.transform=CGAffineTransformMakeTranslation(50, 200);
//原有基础上累积移动(50,50) 注意:值的正负代表了xy方向
self.headImageView.transform=CGAffineTransformTranslate(self.headImageView.transform, 50, 50);
缩放:
//缩放一次
self.headImageView.transform=CGAffineTransformMakeScale(1.2, 10);
//在原有的基础上每执行一次缩放一次
self.headImageView.transform=CGAffineTransformScale(self.headImageView.transform, 1.5, 1.6);
还有旋转也是非常容易使用的:
//旋转角度为1/pi,逆时针
self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, -M_1_PI);
//旋转的角度为pi/2,顺时针
self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, M_PI_2);