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