iOS動畫基礎(chǔ)之CGAffineTransform和CATransform3D

一,CGAffineTransform

1,CGAffineTransform是UIView層面的屬性,是二維變換,任何view或者繼承UIView的子類都具有該屬性,可以通過這個變換實現(xiàn)對控件二維平面上的平移,旋轉(zhuǎn),縮放等
2,CGAffineTransform變換有兩種方式:
  • 2.1, 狀態(tài)改變:
  • 從一種狀態(tài)變換到另外一種狀態(tài),結(jié)果不會疊加,相當(dāng)于一次性操作,如下:
//旋轉(zhuǎn)
_imageView.transform = CGAffineTransformMakeRotation(M_PI);//注意這里應(yīng)該是弧度制,默認(rèn)順時針
//平移
_imageView.transform = CGAffineTransformMakeTranslation(20, 400);
//縮放
_imageView.transform = CGAffineTransformMakeScale(1.5, 1.5);
  • 2.2, 值的改變
  • 這種變換是建立在上一次變換的基礎(chǔ)之上,結(jié)果會疊加,如下:
//旋轉(zhuǎn)
_imageView.transform = CGAffineTransformRotate(_imageView.transform, M_PI);//注意這里應(yīng)該是弧度制,默認(rèn)順時針

//平移
_imageView.transform = CGAffineTransformTranslate(_imageView.transform, 0, 30);

//縮放
_imageView.transform = CGAffineTransformScale(_imageView.transform, 0, 10);

  • 2.3, 但是有一點需要注意:如果需要同時進(jìn)行多個變換,比如說同時進(jìn)行平移和縮放,那么直接對_imageView.transform會覆蓋掉上一次的變換,解決辦法如下:
  • 把第二次的操作基于第一次操作之上即可,如下,第二次旋轉(zhuǎn)操作是基于第一次縮放操作之上進(jìn)行的:
CGAffineTransform transformScale = CGAffineTransformScale(_imageView.transform, 1.1, 1.1);
CGAffineTransform transformRotate = CGAffineTransformRotate(transformScale, M_PI_4);
_imageView.transform = transformRotate;

二,CATransform3D

1,CATransform3D是layer層面的屬性,是三維屬性,任何layer可以通過這個變換實現(xiàn)對控件在三維空間上的平移,旋轉(zhuǎn),縮放等
2,同二維變換一樣,CATransform3D變換有兩種方式:
  • 2.1, 狀態(tài)改變:
//首先取得layer層
CALayer *layer = _imageView.layer;

//可以進(jìn)行旋轉(zhuǎn)
layer.transform = CATransform3DMakeRotation(M_PI, 1, 0, 0);
//或者平移
layer.transform = CATransform3DMakeTranslation(0, 200, 1000);

//又或者縮放
layer.transform = CATransform3DMakeScale(1.1, 1.1, 1.5);
  • 2.2, 值的改變
  • 種變換是建立在上一次變換的基礎(chǔ)之上,結(jié)果會疊加,如下:
//旋轉(zhuǎn)
layer.transform = CATransform3DRotate(layer.transform, M_PI, 1, 0, 0);
//抑或平移
layer.transform = CATransform3DTranslate(layer.transform, 0, 200, 0);
//又或縮放
layer.transform = CATransform3DScale(layer.transform, 1.2, 1.2, 1.2);
  • 2.3, 多個變換組合起來,即一次性進(jìn)行多個不同的變換
//同時進(jìn)行旋轉(zhuǎn),縮放,平移操作
//注意:這里旋轉(zhuǎn)180之后之后y軸正方向是會改變的
CATransform3D transformRotate = CATransform3DRotate(layer.transform, M_PI, 1, 0, 0);
CATransform3D transformTranslate = CATransform3DTranslate(transformRotate, 0, 200, 0);
layer.transform = CATransform3DScale(transformTranslate, 1.2, 1.2, 1.2);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容