CGAffineTransform 详解

矩阵乘法 函数

A B相乘要A的列数等于B的行数才有定义,结果是一个AB列的矩阵CC的每一个元素值为A对应的行与B对应的列的元素乘积的和 spa

具体看这里 code

原理 orm

CGAffineTransform ip

CGAffineTransform 的结构以下 get

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

它其实表示的是一个矩阵 it

  

由于最后一列老是是(0,0,1),因此有用的信息就是前面两列 io

对一个view进行仿射变化就至关于对view上的每一个点作一个乘法 form

结果就是 基础

 

基本上就是若是不看c和b的话

a表示x水平方向的缩放,tx表示x水平方向的偏移

d表示y垂直方向的缩放,ty表示y垂直方向的偏移

若是b和c不为零的话,那么视图确定发生了旋转

从上面的式子也能够看出,仿射变化是不会对视图的基本形状发生该表的(矩形仍是矩形,不会变成平行四边形,梯形)

常量

CGAffineTransformIdentity const CGAffineTransformCGAffineTransformIdentity;

 这个就是没有变化的最初的样子

 

建立一个仿射矩阵

  • CGAffineTransformMake 直接赋值来建立
  • CGAffineTransformMakeRotation 设置角度来生成矩阵
  • 结果就是
  • CGAffineTransformMakeScale  设置缩放,及改变a、d的值
  • CGAffineTransformMakeTranslation  设置偏移

改变已经存在的放射矩阵

  • CGAffineTransformTranslate  原始的基础上加上偏移
  • CGAffineTransformScale加上缩放
  • CGAffineTransformRotate加上旋转
  • CGAffineTransformInvert 反向的仿射矩阵好比(x,y)经过矩阵t获得了(x',y')那么经过这个函数生成的t'做用与(x',y')就能获得原始的(x,y)
  • CGAffineTransformConcat 经过两个已经存在的放射矩阵生成一个新的矩阵t' = t1 * t2

应用仿射矩阵

  • CGPointApplyAffineTransform 获得新的点
  • CGSizeApplyAffineTransform  获得新的size
  • CGRectApplyAffineTransform  获得新的rect

评测矩阵

  • CGAffineTransformIsIdentity  是不是CGAffineTransformIsIdentity
  • CGAffineTransformEqualToTransform 看两个矩阵是否相等

 

应用

放射矩阵一个经常使用的情形就是根据用户的手势来相应的改变视图的变换

UIPanGestureRecognizer  对应位移

UIPinchGestureRecognizer  对应缩放

UIRotationGestureRecognizer 对应旋转

一般若是须要看到实时的手指移动视图就相应的变换的技巧就是,每次接收到对应的gesture时间就相应的改变view的transform,而后吧这个gesture对应的translationscale、rotation置为初始值。

相关文章
相关标签/搜索