首先說一下CGAffineTransform的常見應(yīng)用場(chǎng)景
- 與CoreGraphics一起用來畫畫探膊;
- 根據(jù)用戶的手勢(shì)調(diào)整相應(yīng)視圖的大小捧灰、縮放句伶、旋轉(zhuǎn)等片仿;
- 做動(dòng)畫的時(shí)候有用到纹安;
反射矩陣原理
這樣可以看出其實(shí)變換之后的x' 和a、c砂豌、tx有關(guān)系厢岂,y'和b、d阳距、ty有關(guān)系咪笑。
可以通過這些值的變化組合成可以縮放、平移娄涩、旋轉(zhuǎn)等各種變形的變化
簡(jiǎn)單點(diǎn)去想,如果c和b都為0映跟,這樣就x'和y'就只能是x和y的縮放和平移了
這樣就只能通過改變a和d做縮放變換蓄拣,利用tx,ty做平移變換
再簡(jiǎn)單一點(diǎn),如果a=1,c=0,tx=0努隙;b=0,d=0,ty=0;則會(huì)出現(xiàn)x'=x;y'=y;也就是說[1,0,0,1,0,0]這就是沒有任何變換的矩陣球恤。蘋果用一個(gè)常量CGAffineTransformIdentity定義
/* The identity transform: [ 1 0 0 1 0 0 ]. */
CG_EXTERN const CGAffineTransform CGAffineTransformIdentity
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
只要是看得到的界面基本都有transform屬性,并且默認(rèn)是CGAffineTransformIdentity
@property(nonatomic) CGAffineTransform transform; // default is CGAffineTransformIdentity
蘋果對(duì)一些常用的變換進(jìn)行了整合荸镊,是開發(fā)起來更加方便
最基本的方法
這一個(gè)是最基本的方法咽斧,也是最強(qiáng)大的方法,對(duì)應(yīng)上邊分析的各個(gè)參數(shù)躬存,但是在開發(fā)中不常用张惹,對(duì)應(yīng)的值不好掌握。蘋果有提供了特定功能的方法岭洲。
/* Return the transform [ a b c d tx ty ]. */
CG_EXTERN CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloat b,
CGFloat c, CGFloat d, CGFloat tx, CGFloat ty)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
平移變換矩陣
/* Return a transform which translates by `(tx, ty)':
t' = [ 1 0 0 1 tx ty ] */
CG_EXTERN CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,
CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
/* Translate
t' by
(tx, ty)' and return the result:
t' = [ 1 0 0 1 tx ty ] * t */
CG_EXTERN CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t,
CGFloat tx, CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
縮放變換矩陣
/* Return a transform which scales by `(sx, sy)':
t' = [ sx 0 0 sy 0 0 ] */
CG_EXTERN CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
/* Scale
t' by
(sx, sy)' and return the result:
t' = [ sx 0 0 sy 0 0 ] * t */
CG_EXTERN CGAffineTransform CGAffineTransformScale(CGAffineTransform t,
CGFloat sx, CGFloat sy) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
旋轉(zhuǎn)變換矩陣
/* Return a transform which rotates by `angle' radians:
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] */
CG_EXTERN CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
/* Rotate
t' by
angle' radians and return the result:
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] * t */
CG_EXTERN CGAffineTransform CGAffineTransformRotate(CGAffineTransform t,
CGFloat angle) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
反轉(zhuǎn)
/* Invert
t' and return the result. If
t' has zero determinant, then `t'
is returned unchanged. */
CG_EXTERN CGAffineTransform CGAffineTransformInvert(CGAffineTransform t)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
合并
/* Concatenate
t2' to
t1' and return the result:
t' = t1 * t2 */
CG_EXTERN CGAffineTransform CGAffineTransformConcat(CGAffineTransform t1,
CGAffineTransform t2) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
兩個(gè)比較方法
是否是初始矩陣
/* Return true if `t' is the identity transform, false otherwise. */
CG_EXTERN bool CGAffineTransformIsIdentity(CGAffineTransform t)
CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
是否相同
/* Return true if
t1' and
t2' are equal, false otherwise. */
CG_EXTERN bool CGAffineTransformEqualToTransform(CGAffineTransform t1,
CGAffineTransform t2) CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
通過AffineTransform計(jì)算對(duì)應(yīng)的的point宛逗、size、rect
point轉(zhuǎn)換
/* Transform
point' by
t' and return the result:
p' = p * t
where p = [ x y 1 ]. */
CG_EXTERN CGPoint CGPointApplyAffineTransform(CGPoint point,
CGAffineTransform t) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
size 轉(zhuǎn)換
/* Transform
size' by
t' and return the result:
s' = s * t
where s = [ width height 0 ]. */
CG_EXTERN CGSize CGSizeApplyAffineTransform(CGSize size, CGAffineTransform t)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
rect轉(zhuǎn)換
/* Transform
rect' by
t' and return the result. Since affine transforms do
not preserve rectangles in general, this function returns the smallest
rectangle which contains the transformed corner points ofrect'. If
t'
consists solely of scales, flips and translations, then the returned
rectangle coincides with the rectangle constructed from the four
transformed corners. */
CG_EXTERN CGRect CGRectApplyAffineTransform(CGRect rect, CGAffineTransform t)
CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
總結(jié)
CGAffineTransform 是轉(zhuǎn)換坐標(biāo)的一個(gè)工具類盾剩,內(nèi)部基于了一個(gè)數(shù)學(xué)公式雷激。