CGAffineTransform

本文章学习于这两篇优秀博客:

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);









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值