CGAffineTransform 用於視圖平移,放縮,旋轉

CGAffineTransform
今天碰到了一個旋轉放縮圖片的一個demo,在看的過程中發現實現圖片變化的那個方法特別簡單。
一共只有三句話,下面就是這個方法
- (void)transformImageView
{
CGAffineTransform t = CGAffineTransformMakeScale(scale * previousScale,
scale * previousScale);
t = CGAffineTransformRotate(t, rotation + previousRotation);
self.imageView.transform = t;

}

來說一下這個方法的內容
1、首先創建了一個變換CGAffineTransform的一個對象 t (至於CGAffineTransform是什麼咱們後面會詳細說),
這個變換是用來放縮的,裏面的兩個參數分別是對寬和高放大或縮小的倍數,這裏是以相同比例放縮的。
2、第二行句是在放縮變化中再加入角度的變換。‘
3、最後把變換賦給圖片視圖的一個屬性transform。
就這麼簡單就實現了圖片的旋轉和放縮。
當然這裏面最讓人頭大的就是CGAffineTransform,爲此我特地翻了一下文檔


CGAffineTransform
首先我查到的這個類其實就是一個變換,一個3*3矩陣的變換


\

 

結果就是

\


CGAffineTransform類的方法

一、創建一個Transformations

1、CGAffineTransformMake //直接創建變換
CGAffineTransform CGAffineTransformMake (
CGFloat a,
CGFloat b,
CGFloat c,
CGFloat d,
CGFloat tx,
CGFloat ty );
可以看到參數比較多,其實它就是對應矩陣的前兩列。據我估計,
可能一般不會直接用這個做變換。


2、CGAffineTransformMakeScale //創建一個給定比例放縮的變換

CGAffineTransform CGAffineTransformMakeScale (CGFloat sx, CGFloat sy);
可以看到這個參數就少多了,也比較好理解,假設是一個圖片視圖引用了這個變換,
那麼圖片的寬度就會變爲 width*sx ,對應高度變爲 hight * sy。


3、CGAffineTransformMakeRotation //創建一個旋轉角度的變化

CGAffineTransform CGAffineTransformMakeRotation ( CGFloat angle);
在這裏可以看到參數並不是一個角度,但是它是把參數作爲一個弧度,然後把弧度再轉換爲角度來處理,
其結果就可能是將一個圖片視圖旋轉了多少度。

4、CGAffineTransformMakeTranslation //創建一個平移的變化

CGAffineTransform CGAffineTransformMakeTranslation (CGFloat tx,CGFloat ty);
這個就比較好理解了,假設是一個視圖,那麼它的起始位置 x 會加上tx , y 會加上 ty


二、修改Transformations

1、CGAffineTransformTranslate //爲一個變換再加上平移

CGAffineTransform CGAffineTransformTranslate (
CGAffineTransform t,
CGFloat tx,
CGFloat ty
);
簡單來說就是在變化 t 上在加上平移


2、CGAffineTransformScale //爲一個Transformation再加上縮放

CGAffineTransform CGAffineTransformScale (
CGAffineTransform t,
CGFloat sx,
CGFloat sy);

3、CGAffineTransformRotate //爲一個Transformation再加上旋轉

CGAffineTransform CGAffineTransformRotate (
CGAffineTransform t,
CGFloat angle
);

4、CGAffineTransformInvert //返回Transformation的反向

CGAffineTransform CGAffineTransformInvert (CGAffineTransform t);

5、CGAffineTransformConcat //合併兩個Transformation

CGAffineTransform CGAffineTransformConcat (CGAffineTransform t1, CGAffineTransform t2);
返回一個由 t1 和 t2 合併而成的Transformation


三、運用Transformations

1、CGPointApplyAffineTransform //把變化應用到一個點上

CGPoint CGPointApplyAffineTransform (
CGPoint point,
CGAffineTransform t );
這個方法的返回值還是一個CGPoint,在我看來由於是一個點,
這個方法最終也只會影響這個點所在的位置。


2、CGSizeApplyAffineTransform //運用到一個區域中

CGSize CGSizeApplyAffineTransform (
CGSize size,
CGAffineTransform t);
只會改變區域的大小

3、CGRectApplyAffineTransform //運用到一個帶原點的區間

CGRect CGRectApplyAffineTransform (
CGRect rect,
CGAffineTransform t);


這個我親自試驗過,三個屬性 放縮、旋轉和平移都有的一個Transformation ,
但處理之後只會改變這個區域原點的位置,和寬、高的大小,並不會旋轉


四、檢測一個Transformation

1、CGAffineTransformIsIdentity //檢測一個Transformation是不是恆等變換,也就是說不變

bool CGAffineTransformIsIdentity ( CGAffineTransform t);//其結果返回一個BOOL值


2、CGAffineTransformEqualToTransform //檢測兩個Transformation是否相等。

bool CGAffineTransformEqualToTransform (
CGAffineTransform t1,

CGAffineTransform t2);


http://www.2cto.com/kf/201312/266676.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章