?????????????????????????????? CGAffineTransform(是一個3*3的矩陣)
X'=ax+cy+tx;
Y'=bx+dy+ty;
其中a是控制x的縮放比例,d是控制y的縮放比例;
x會跟著c的值進行拉伸(c*y,與y有關系),y會跟著b的值進行拉伸(b*x,說明x有關),要注意到的是c和b的值改變不會影響到View的point(center中心點)的改變。這是個很有意思的兩個參數。其實,這里返回的就是每個點的坐標。b,c的值不會影響到center。當我們改變b ,c的時候,我們所計算出來的點形成的view的center,并不是原來的center。我們需要把對view進行平移,到原來的中心點,這樣才是view顯示出來的frame。
顯然原來的frame:(50,50,100,100)
改變c的值后的frame:(0,50,200,100)
現在讓我們來計算一下:1.取出view的四個頂點(50,50),(150,50),(50,150),(150,150)。
2.計算這四個頂點結果分別于矩陣| 1 0 0? |??????
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? | 1 1? 0? |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? | 0 0? 1? | ?????????????????????????????????????????????????????????????????????????
想乘結果為 (100,50)(200,50)(200,150) (300,150)
相連后是一個平行四邊形。所在的矩陣frame為(100 ,50 ,200,100),center(200,100)。因為center(原來的center(100,100))不變,需要左平移動 ? 100 ???? ,那么得到的frame是(0,50,200,100)。與運行得到的frame是一樣的。 ???
x會跟著t.x進行x做表平移,y會跟著t.y進行平移。這里的point(center)是跟著變換的
CGAffineTransformInvert(CGAffineTransf)是將 b , c, tx ,ty變成原來的相反數(-b,-c,-tx,-ty)矩陣。如果你設置的矩陣,運行log打印:CGAffineTransformInvert: singular matrix。那么你不會得到反轉后的矩陣,會還是原來的矩陣。
①CGPointApplyAffineTransform(CGPoint point,CGAffineTransform t)? 得到轉化后point CGPoint
②CGSizeApplyAffineTransform(CGSize size,CGAffineTransform t)? ? ? ? ? 得到轉化后size CGSize
③CGRectApplyAffineTransform(CGRect rect,CGAffineTransform t)? ? ? ? 得到轉化后rect CGRect
???????????????????????????????????????? CATransform3D(4*4矩陣)
{
CGFloat m11(x縮放), m12(y切變), m13(), m14();
CGFloat m21(x切變), m22(y縮放), m23(), m24();
CGFloat m31(), m32(), m33(), m34(透視效果,要操作的這個對象要有旋轉的角度,否則沒有效果。當然,z方向上得有變化才會有透視效果(就是近大遠小));
CGFloat m41(x平移), m42(y平移), m43(z平移), m44();
};