一,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變換有兩種方式:
//首先取得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);