CGAffineTransform相關(guān)函數(shù)
- CGAffineTransformMakeTranslation(CGFloat tx,
CGFloat ty);是改變位置的蔽莱, - CGAffineTransformRotate(CGAffineTransform t,
CGFloat angle)旋轉(zhuǎn)谱姓,需要傳入一個transform和一個角度 - CGAffineTransformMakeRotation(CGFloat angle)旋轉(zhuǎn)的乖酬,直接傳入一個角度
- CGAffineTransformScale(CGAffineTransform t,
CGFloat sx, CGFloat sy)是縮放的 - CGAffineTransformIdentity線性代數(shù)里面講的矩陣變換涵卵,這個是恒等變換喘落,當你改變過一個view.transform屬性或者view.layer.transform的時候需要恢復默認狀態(tài)的話做盅,記得先把他們重置可以使用,(假設你一直不斷的改變一個view.transform的屬性分扎,而每次改變之前沒有重置的話澄成,你會發(fā)現(xiàn)后來 的改變和你想要的發(fā)生變化了,不是你真正想要的結(jié)果)
CTM
Quartz轉(zhuǎn)換實現(xiàn)的原理:Quartz把繪圖分成兩個部分畏吓,
用戶空間墨状,即和設備無關(guān),
設備空間菲饼,
用戶空間和設備空間中間存在一個轉(zhuǎn)換矩陣 : CTM
Quartz提供的3大功能
- 移動
- 旋轉(zhuǎn)
- 縮放
演示如下肾砂,首先加載一張圖片
void CGContextDrawImage (
CGContextRef c,
CGRect rect,
CGImageRef image
);
-
移動函數(shù)
CGContextTranslateCTM (myContext, 100, 50);
-
旋轉(zhuǎn)函數(shù)
include <math.h> static inline double radians (double degrees) {return degrees * M_PI/180;} CGContextRotateCTM (myContext, radians(–45.));
縮放
CGContextScaleCTM (myContext, .5, .75);
翻轉(zhuǎn), 兩種轉(zhuǎn)換合成后的效果巴粪,先把圖片移動到右上角通今,然后旋轉(zhuǎn)180度
CGContextTranslateCTM (myContext, w,h);
CGContextRotateCTM (myContext, radians(-180.));
組合幾個動作
CGContextTranslateCTM (myContext, w/4, 0);
CGContextScaleCTM (myContext, .25, .5);
CGContextRotateCTM (myContext, radians ( 22.));
CGContextRotateCTM (myContext, radians ( 22.));
CGContextScaleCTM (myContext, .25, .5);
CGContextTranslateCTM (myContext, w/4, 0);
上面是通過直接修改當前的ctm實現(xiàn)3大效果粥谬,下面是通過創(chuàng)建Affine Transforms肛根,然后連接ctm實現(xiàn)同樣的3種效果
這樣做的好處是可以重用這個Affine Transforms
應用Affine Transforms 到ctm的函數(shù)
void CGContextConcatCTM (
CGContextRef c,
CGAffineTransform transform
);
Creating Affine Transforms
移動效果
CGAffineTransform CGAffineTransformMakeTranslation (
CGFloat tx,
CGFloat ty
);
CGAffineTransform CGAffineTransformTranslate (
CGAffineTransform t,
CGFloat tx,
CGFloat ty
);
旋轉(zhuǎn)效果
CGAffineTransform CGAffineTransformMakeRotation (
CGFloat angle
);
CGAffineTransform CGAffineTransformRotate (
CGAffineTransform t,
CGFloat angle
);
縮放效果
CGAffineTransform CGAffineTransformMakeScale (
CGFloat sx,
CGFloat sy
);
CGAffineTransform CGAffineTransformScale (
CGAffineTransform t,
CGFloat sx,
CGFloat sy
);
反轉(zhuǎn)效果
CGAffineTransform CGAffineTransformInvert (
CGAffineTransform t
);
只對局部產(chǎn)生效果
CGRect CGRectApplyAffineTransform (
CGRect rect,
CGAffineTransform t
);
判斷兩個AffineTrans是否相等
bool CGAffineTransformEqualToTransform (
CGAffineTransform t1,
CGAffineTransform t2
);
獲得Affine Transform
CGAffineTransform CGContextGetUserSpaceToDeviceSpaceTransform (
CGContextRef c
);
下面的函數(shù)只起到查看的效果,比如看一下這個用戶空間的點漏策,轉(zhuǎn)換到設備空間去坐標是多少
CGPoint CGContextConvertPointToDeviceSpace (
CGContextRef c,
CGPoint point
);
CGPoint CGContextConvertPointToUserSpace (
CGContextRef c,
CGPoint point
);
CGSize CGContextConvertSizeToDeviceSpace (
CGContextRef c,
CGSize size
);
CGSize CGContextConvertSizeToUserSpace (
CGContextRef c,
CGSize size
);
CGRect CGContextConvertRectToDeviceSpace (
CGContextRef c,
CGRect rect
);
CGRect CGContextConvertRectToUserSpace (
CGContextRef c,
CGRect rect
);
CTM真正的數(shù)學行為
這個轉(zhuǎn)換矩陣其實是一個 3×3的 舉證
如下圖
下面舉例說明幾個轉(zhuǎn)換運算的數(shù)學實現(xiàn)
x y 是原先點的坐標
下面是從用戶坐標轉(zhuǎn)換到設備坐標的計算公式
下面是一個identity matrix派哲,就是輸入什么坐標,出來什么坐標掺喻,沒有轉(zhuǎn)換
最終的計算結(jié)果是 x=x芭届,y=y储矩,
可以用函數(shù)判斷這個矩陣是不是一個 identity matrix
bool CGAffineTransformIsIdentity (
CGAffineTransform t
);
– (void)willAnimateFirstHalfOfRotationToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation duration: (NSTimeInterval)duration
{
if (toInterfaceOrientation == UIInterfaceOrientationPortrait)
{
b=YES;
self.view=mainvv;
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0));
self.view.bounds = CGRectMake(0.0, 0.0, 768.0, 1004.0);
}
else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
{
b=NO;
self.view = self.vv;
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
self.view.bounds = CGRectMake(0.0, 0.0, 1024.0, 748.0);
}
else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
{
b=YES;
self.view=mainvv;
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180));
self.view.bounds = CGRectMake(0.0, 0.0, 768.0, 1004.0);
}
else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
b=NO;
self.view = self.vv;
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
self.view.bounds = CGRectMake(0.0, 0.0, 1024.0, 748.0);
}
}
3
Quartz轉(zhuǎn)換實現(xiàn)的原理:Quartz把繪圖分成兩個部分,
用戶空間褂乍,即和設備無關(guān)持隧,
設備空間,
用戶空間和設備空間中間存在一個轉(zhuǎn)換矩陣 : CTM
本章實質(zhì)是講解CTM
Quartz提供的3大功能
移動逃片,旋轉(zhuǎn)屡拨,縮放
演示如下,首先加載一張圖片
void CGContextDrawImage (
CGContextRef c,
CGRect rect,
CGImageRef image
);
移動函數(shù)
CGContextTranslateCTM (myContext, 100, 50);
旋轉(zhuǎn)函數(shù)
include <math.h>
static inline double radians (double degrees) {return degrees * M_PI/180;}
CGContextRotateCTM (myContext, radians(–45.));
縮放
CGContextScaleCTM (myContext, .5, .75);
翻轉(zhuǎn)褥实, 兩種轉(zhuǎn)換合成后的效果呀狼,先把圖片移動到右上角,然后旋轉(zhuǎn)180度
CGContextTranslateCTM (myContext, w,h);
CGContextRotateCTM (myContext, radians(-180.));
組合幾個動作
CGContextTranslateCTM (myContext, w/4, 0);
CGContextScaleCTM (myContext, .25, .5);
CGContextRotateCTM (myContext, radians ( 22.));
CGContextRotateCTM (myContext, radians ( 22.));
CGContextScaleCTM (myContext, .25, .5);
CGContextTranslateCTM (myContext, w/4, 0);
上面是通過直接修改當前的ctm實現(xiàn)3大效果损离,下面是通過創(chuàng)建Affine Transforms哥艇,然后連接ctm實現(xiàn)同樣的3種效果
這樣做的好處是可以重用這個Affine Transforms
應用Affine Transforms 到ctm的函數(shù)
void CGContextConcatCTM (
CGContextRef c,
CGAffineTransform transform
);
Creating Affine Transforms
移動效果
CGAffineTransform CGAffineTransformMakeTranslation (
CGFloat tx,
CGFloat ty
);
CGAffineTransform CGAffineTransformTranslate (
CGAffineTransform t,
CGFloat tx,
CGFloat ty
);
旋轉(zhuǎn)效果
CGAffineTransform CGAffineTransformMakeRotation (
CGFloat angle
);
CGAffineTransform CGAffineTransformRotate (
CGAffineTransform t,
CGFloat angle
);
縮放效果
CGAffineTransform CGAffineTransformMakeScale (
CGFloat sx,
CGFloat sy
);
CGAffineTransform CGAffineTransformScale (
CGAffineTransform t,
CGFloat sx,
CGFloat sy
);
反轉(zhuǎn)效果
CGAffineTransform CGAffineTransformInvert (
CGAffineTransform t
);
只對局部產(chǎn)生效果
CGRect CGRectApplyAffineTransform (
CGRect rect,
CGAffineTransform t
);
判斷兩個AffineTrans是否相等
bool CGAffineTransformEqualToTransform (
CGAffineTransform t1,
CGAffineTransform t2
);
獲得Affine Transform
CGAffineTransform CGContextGetUserSpaceToDeviceSpaceTransform (
CGContextRef c
);
下面的函數(shù)只起到查看的效果,比如看一下這個用戶空間的點僻澎,轉(zhuǎn)換到設備空間去坐標是多少
CGPoint CGContextConvertPointToDeviceSpace (
CGContextRef c,
CGPoint point
);
CGPoint CGContextConvertPointToUserSpace (
CGContextRef c,
CGPoint point
);
CGSize CGContextConvertSizeToDeviceSpace (
CGContextRef c,
CGSize size
);
CGSize CGContextConvertSizeToUserSpace (
CGContextRef c,
CGSize size
);
CGRect CGContextConvertRectToDeviceSpace (
CGContextRef c,
CGRect rect
);
CGRect CGContextConvertRectToUserSpace (
CGContextRef c,
CGRect rect
);
CTM真正的數(shù)學行為
這個轉(zhuǎn)換矩陣其實是一個 3×3的 舉證
如下圖
下面舉例說明幾個轉(zhuǎn)換運算的數(shù)學實現(xiàn)
x y 是原先點的坐標
下面是從用戶坐標轉(zhuǎn)換到設備坐標的計算公式
下面是一個identity matrix貌踏,就是輸入什么坐標,出來什么坐標怎棱,沒有轉(zhuǎn)換
最終的計算結(jié)果是 x=x哩俭,y=y,
可以用函數(shù)判斷這個矩陣是不是一個 identity matrix
bool CGAffineTransformIsIdentity (
CGAffineTransform t
);