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置爲初始值。

相關文章
相關標籤/搜索