簡介
-
CGAffineTransform
CGAffineTransform
是CoreGraphics
的結(jié)構(gòu)體靡砌,定義在二維空間上完成UIView
的平移已脓,旋轉(zhuǎn),縮放等效果的實現(xiàn)通殃。 -
CATransform3D
CATransform3D
是CoreAnimation
的結(jié)構(gòu)體度液,是用來做更復(fù)雜的關(guān)于CALayer
的3D操作。
CGAffineTransform
結(jié)構(gòu)體
struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};
為了把二維圖形的變化統(tǒng)一在一個坐標(biāo)系里画舌,引入了齊次坐標(biāo)的概念堕担,即把一個圖形用一個三維矩陣表示,其中第三列總是(0,0,1)骗炉,用來作為坐標(biāo)系的標(biāo)準(zhǔn)照宝。所以所有的變化都由前兩列完成。
CGAffineTransformIdentity
表示一個原始狀態(tài)的CGAffineTransform
句葵。
矩陣算法公式:
例子:
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
view.transform = CGAffineTransformMake(0.2, 0, 0, 1, 0, 0);
// view的frame從原來的(100, 100, 100, 100)變成了(140, 100, 20, 100)
// x` = ax + cy + tx = 0.2 * 100 + 0 * 100 + 0 = 20
// y` = bx + dy + ty = 0 * 100 + 1 * 100 + 0 = 100
總結(jié)
- x按照a值進(jìn)行了比例縮放厕鹃,y按照d的值進(jìn)行比列縮放,最重要的是縮放的過程中
view
的中心點point
是不會改變的乍丈。 - x會跟著c的值進(jìn)行拉伸(
view
的寬度是跟著改變)剂碴,y會跟著b的值進(jìn)行拉伸(view
的高度跟著改變),要注意到的是c和b的值改變不會影響到view
的中心點point
的改變轻专。 - x會跟著tx進(jìn)行x做表平移忆矛,y會跟著ty進(jìn)行平移。這里的中心點
point
是跟著變換的请垛。
CGAffineTransform的使用
- 初始化
// 保持原始狀態(tài)初始化 CGAffineTransform transfrom = CGAffineTransformIdentity; // 變換初始化 CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty);
- 平移
// 根據(jù)本身的transform進(jìn)行平移 CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty) // 根據(jù)本身的transform后者另外的transform進(jìn)行平移 CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)
- 縮放
// 根據(jù)本身的transform進(jìn)行縮放 CGAffineTransformMakeScale(CGFloat sx,CGFloat sy) // 根據(jù)本身的transform后者另外的transform進(jìn)行縮放 CGAffineTransformScale(CGAffineTransform t,CGFloat sx,CGFloat sy)
- 旋轉(zhuǎn)
// 根據(jù)本身的transform進(jìn)行旋轉(zhuǎn) angle 旋轉(zhuǎn)的角度 CGAffineTransformMakeRotation(CGFloat angle) // 根據(jù)本身的transform后者另外的transform進(jìn)行旋轉(zhuǎn) CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)
- 合并
// 兩個transform合并起來 CGAffineTransformConcat(CGAffineTransform t1,CGAffineTransform t2)
- 評測
// 查看是不是默認(rèn)的transform Bool CGAffineTransformIsIdentity(CGAffineTransform t) // 比較兩個transform是否相等 BOOl CGAffineTransformEqualToTransform(CGAffineTransform t1,CGAffineTransform t2)
- 仿射矩陣應(yīng)用
// 得到新的中心 CGPoint CGPointApplyAffineTransform(CGPoint point,CGAffineTransform t) // 得到新的size CGSize CGSizeApplyAffineTransform(CGSize size,CGAffineTransform t) // 得到新的rect CGRect CGRectApplyAffineTransform(CGRect rect,CGAffineTransform t)
CATransform3D
struct CATransform3D {
CGFloat m11(x縮放), m12(y切變), m13(旋轉(zhuǎn)), m14();
CGFloat m21(x切變), m22(y縮放), m23(和m32一起決定x軸的旋轉(zhuǎn)), m24();
CGFloat m31(和m13一起決定y軸的旋轉(zhuǎn)),m32(和m23一起決定x軸的旋轉(zhuǎn)), m33(z縮放), m34(透視效果催训,要操作的這個對象要有旋轉(zhuǎn)的角度,否則沒有效果宗收。正直/負(fù)值都有意義);
CGFloat m41(x平移), m42(y平移), m43(z平移), m44(初始為1);
};
CATransform3D的使用
- 初始化
CATransform3D transfrom = CATransform3DIdentity;
- 平移
// 在x軸方向上平移x單位,在y軸方向上平移y單位,在z軸方向上平移z單位 CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz) //在某個transform3D變換的基礎(chǔ)上進(jìn)行平移變換漫拭,t是上一個transform3D,其他參數(shù)同上 CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx, CGFloat ty, CGFloat tz);
- 縮放
//x混稽,y采驻,z分別對應(yīng)x軸,y軸匈勋,z軸的縮放比例 CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz); //在一個transform3D變換的基礎(chǔ)上進(jìn)行縮放變換礼旅,其他參數(shù)同上 CATransform3D CATransform3DScale (CATransform3D t, CGFloat sx, CGFloat sy, CGFloat sz);
- 旋轉(zhuǎn)
// 實現(xiàn)以初始位置為基準(zhǔn),在x軸,y軸,z軸方向上逆時針旋轉(zhuǎn)angle弧度(弧度=π/180×角度,M_PI弧度代表180角度),x,y,z三個參數(shù)只分是否為0 CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z) //在一個transform3D的基礎(chǔ)上進(jìn)行旋轉(zhuǎn)變換,其他參數(shù)如上 CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle, CGFloat x, CGFloat y, CGFloat z);
- 合并
// 疊加3D仿射效果 CATransform3DConcat (CATransform3D a, CATransform3D b)
CATransform3D和CGAffineTransform相互轉(zhuǎn)換
//將一個CGAffineTransform轉(zhuǎn)化為CATransform3D
CATransform3D CATransform3DMakeAffineTransform (CGAffineTransform m);
//判斷一個CATransform3D是否可以轉(zhuǎn)換為CGAffineTransform
bool CATransform3DIsAffine (CATransform3D t);
//將CATransform3D轉(zhuǎn)換為CGAffineTransform
CGAffineTransform CATransform3DGetAffineTransform (CATransform3D t);
景深
在默認(rèn)情況下洽洁,系統(tǒng)采用正交投影痘系,對于3D形變實際上是看不到3D效果的,在CATransform3D結(jié)構(gòu)體中有一個m34便允許我們將正交投影修改為有近大遠(yuǎn)小立體效果的透視投影饿自,其中m34 = -1.0/z,這個z為觀察者與控件之間的距離汰翠。
m34必須在賦值transform之前設(shè)置才會生效