仿射變換
CGAffineTransform transform;
transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, -50, -50); //A
transform = CGAffineTransformRotate(transform, M_PI_4); //B
transform = CGAffineTransformTranslate(transform, 50, 50); //C
變換后 transform = C×B×A×E。(A,B,C分別為CGAffineTransform變換函數(shù)構造的矩陣),這是由于CGAffineTransform變換函數(shù)構造的矩陣在左邊,如:
t' = CGAffineTransformTranslate(t,tx,ty),結果為:t' = [ 1 0 0 1 tx ty ] * t
4步結果如下:
t = E;
t1 = A × t = A × E = A;
t2 = B × t1 = B × A;
t3 = C × t2 = C × B × A;
此時 (x', y', 1) = (x, y, 1) × t = (x, y, 1) × C × B × A;
也就是說,坐標變換是按照C->B->A的順序變換的,和設置的順序正好相反。
3D變換
CG的前綴告訴我們,CGAffineTransform類型屬于Core Graphics框架,Core Graphics實際上是一個嚴格意義上的2D繪圖API,并且CGAffineTransform僅僅對2D變換有效。
在第三章中,我們提到了zPosition屬性,可以用來讓圖層靠近或者遠離相機(用戶視角),transform屬性(CATransform3D類型)可以真正做到這點,即讓圖層在3D空間內移動或者旋轉。
和CGAffineTransform類似,CATransform3D也是一個矩陣,但是和2x3的矩陣不同,CATransform3D是一個可以在3維空間內做變換的4x4的矩陣(圖5.6)。

對一個3D像素點做CATransform3D矩陣變換和CGAffineTransform矩陣類似,Core Animation提供了一系列的方法用來創(chuàng)建和組合CATransform3D類型的矩陣,和Core Graphics的函數(shù)類似,但是3D的平移和旋轉多處了一個z參數(shù),并且旋轉函數(shù)除了angle之外多出了x,y,z三個參數(shù),分別決定了每個坐標軸方向上的旋轉:
CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz)
CATransform3DMakeTranslation(Gloat tx, CGFloat ty, CGFloat tz)
你應該對X軸和Y軸比較熟悉了,分別以右和下為正方向(回憶第三章,這是iOS上的標準結構,在Mac OS,Y軸朝上為正方向),Z軸和這兩個軸分別垂直,指向視角外為正方向(圖5.7)。

由圖所見,繞Z軸的旋轉等同于之前二維空間的仿射旋轉,但是繞X軸和Y軸的旋轉就突破了屏幕的二維空間,并且在用戶視角看來發(fā)生了傾斜。
參考資料:https://zsisme.gitbooks.io/ios-/content/chapter5/3d-transform.html