CGAffineTransform 縮放 / 旋轉 / 平移


CGAffineTransform此類是一個3*3矩陣的變換。

 

- (void)transformImageView

{

CGAffineTransform t = CGAffineTransformMakeScale(scale * previousScale,

scale * previousScale);

t = CGAffineTransformRotate(t, rotation + previousRotation);

self.imageView.transform = t;

}

1、首先創建了一個變換CGAffineTransform的一個對象 t ,這個變換是用來放縮的,里面的兩個參數分別是對寬和高放大或縮小的倍數,這里是以相同比例放縮的。

2、第二行句是在放縮變化中再加入角度的變換。‘

3、最后把變換賦給圖片視圖的一個屬性transform。

就這么簡單就實現了圖片的旋轉和放縮。

 

CGAffineTransform類的方法

一、創建一個Transformations

1、CGAffineTransformMake  //直接創建變換

CGAffineTransform CGAffineTransformMake (

CGFloat a,

CGFloat b,

CGFloat c,

CGFloat d,

CGFloat tx,

CGFloat ty );

可以看到參數比較多,其實它就是對應矩陣的前兩列。據我估計,

可能一般不會直接用這個做變換。

2、CGAffineTransformMakeScale (CGFloat sx, CGFloat sy);//創建一個給定比例放縮的變換

視圖引用了這個變換,那么圖片的寬度就會變為  width*sx  ,對應高度變為  hight * sy。

CGAffineTransformMakeScale(-1.0, 1.0);//水平翻轉

CGAffineTransformMakeScale(1.0,-1.0);//垂直翻轉

3、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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM