iOS 仿射變換CGAffineTransform

iOS所有繼承UIView的類都有一個(gè)CGAffineTransform類型的屬性transform,它是定義在二維空間上完成View的平移,旋轉(zhuǎn),縮放等效果的實(shí)現(xiàn)。這篇文章主要是展示所有值變化的效果。

一:下面是原始的(默認(rèn)的)transform
                      1(a)   0(b)   0
    
 仿射變換  transform:  0(c)   1(d)   0
    
                      0(tx)  0(ty)  1
    
          CGAffineTransformMake(a, b, c, d, tx, ty)
  默認(rèn)值   CGAffineTransformMake(1, 0, 0, 1,  0,  0);
二:實(shí)戰(zhàn)演示

1.原始值


self.contenView.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 0);

2.修改a的值

self.contenView.transform = CGAffineTransformMake(2, 0, 0, 1, 0, 0);

3.修改b的值


self.contenView.transform = CGAffineTransformMake(1, 1, 0, 1, 0, 0);

4.修改c的值


self.contenView.transform = CGAffineTransformMake(1, 0, 1, 1, 0, 0);

5.修改d的值

self.contenView.transform = CGAffineTransformMake(1, 0, 0, 2, 0, 0);

6.修改tx的值

self.contenView.transform = CGAffineTransformMake(1, 0, 0, 1, 100, 0);

7.修改ty的值


self.contenView.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 100);

相信同學(xué)應(yīng)該知道了它們每一個(gè)值的變化,這樣就可以通過(guò)修改它們的值來(lái)完成你想要的動(dòng)畫(huà)效果。

三:下面是Apple整合的transform
  • 平移 :

①根據(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)

CGAffineTransformMakeRotation(CGFloat angle) (angle 旋轉(zhuǎn)的角度)

②根據(jù)本身的transform后者另外的transform進(jìn)行旋轉(zhuǎn)

CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)

  • 恢復(fù) :反向旋轉(zhuǎn)

CGAffineTransformInvert(CGAffineTransform t)

  • 合并:

CGAffineTransformConcat(CGAffineTransform t1,CGAffineTransform t2)
兩個(gè)transform合并起來(lái)

  • 傾斜:

這個(gè)使我們自己定義

-(CGAffineTransform) CGAffineTransformMakeShear(CGFloat x,CGFloat y)

{   
CGAffineTransform transform = CGAffineTransformIdentity;

transform.c= -x;
transform.b= y;
returntransform;   
}
layer.affineTransform = CGAffineTransformMakeShear(1,0);
  • 評(píng)測(cè):

查看是不是默認(rèn)的transform
Bool CGAffineTransformIsIdentity(CGAffineTransform t)

比較兩個(gè)transform是否相等
bool CGAffineTransformEqualToTransform(CGAffineTransform t1,CGAffineTransform t2)

仿射矩陣應(yīng)用:

CGPointApplyAffineTransform(CGPoint point,CGAffineTransform t)得到新的中心CGPoint

CGSizeApplyAffineTransform(CGSize size,CGAffineTransform t) 得到新的size CGSize

CGRectApplyAffineTransform(CGRect rect,CGAffineTransform t) 得到新的rect CGRect

放射矩陣一個(gè)常用的情形就是根據(jù)用戶的手勢(shì)來(lái)相應(yīng)的改變視圖的變換

UIPanGestureRecognizer 位移

UIPinchGestureRecognizer 縮放

UIRotationGestureRecognizer 旋轉(zhuǎn)

蘋(píng)果官方的建議,要多次使用transform,最好是初始化一個(gè)CGAffineTransform,進(jìn)行多次操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容