CoreGraphics.h
CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI_2);
[xxx setTransform:rotation];
呵呵就這么簡單的兩行代碼就可以實現了!
順便記錄一些常量,以后用的着!
#define M_E 2.71828182845904523536028747135266250 e
#define M_LOG2E 1.44269504088896340735992468100189214 log 2e
#define M_LOG10E 0.434294481903251827651128918916605082 log 10e
#define M_LN2 0.693147180559945309417232121458176568 log e2
#define M_LN10 2.30258509299404568401799145468436421 log e10
#define M_PI 3.14159265358979323846264338327950288 pi
#define M_PI_2 1.57079632679489661923132169163975144 pi/2
#define M_PI_4 0.785398163397448309615660845819875721 pi/4
#define M_1_PI 0.318309886183790671537767526745028724 1/pi
#define M_2_PI 0.636619772367581343075535053490057448 2/pi
#define M_2_SQRTPI 1.12837916709551257389615890312154517 2/sqrt(pi)
#define M_SQRT2 1.41421356237309504880168872420969808 sqrt(2)
#define M_SQRT1_2 0.707106781186547524400844362104849039 1/sqrt(2)
from:http://donbe.blog.163.com/blog/static/138048021201061054243442/
CGAffineTransformMakeTranslation(width, 0.0);是改變位置的,
CGAffineTransformRotate(transform, M_PI);是旋轉的。
CGAffineTransformMakeRotation(-M_PI);也是旋轉的
transform = CGAffineTransformScale(transform, -1.0, 1.0);是縮放的。
view.transform = CGAffineTransformIdentity;線性代數里面講的矩陣變換,這個是恆等變換 當 你改變過一個view.transform屬性或者view.layer.transform的時候需要恢復默認狀態的話,記得先把他們重置可以使用
view.transform = CGAffineTransformIdentity,
或者view.layer.transform = CATransform3DIdentity,
假設你一直不斷的改變一個view.transform的屬性,而每次改變之前沒有重置的話,你會發現后來 的改變和你想要的發生變化了,不是你真正想要的結果
Quartz轉換實現的原理:Quartz把繪圖分成兩個部分,
用戶空間,即和設備無關,
設備空間,
用戶空間和設備空間中間存在一個轉換矩陣 : CTM
本章實質是講解CTM
Quartz提供的3大功能
移動,旋轉,縮放
演示如下,首先加載一張圖片
void CGContextDrawImage (
CGContextRef c,
CGRect rect,
CGImageRef image
);
移動函數
CGContextTranslateCTM (myContext, 100, 50);
旋轉函數
include <math.h>
static inline double radians (double degrees) {return degrees * M_PI/180;}
CGContextRotateCTM (myContext, radians(–45.));
縮放
CGContextScaleCTM (myContext, .5, .75);
翻轉, 兩種轉換合成后的效果,先把圖片移動到右上角,然后旋轉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實現3大效果,下面是通過創建Affine Transforms,然后連接ctm實現同樣的3種效果
這樣做的好處是可以重用這個Affine Transforms
應用Affine Transforms 到ctm的函數
void CGContextConcatCTM (
CGContextRef c,
CGAffineTransform transform
);
Creating Affine Transforms
移動效果
CGAffineTransform CGAffineTransformMakeTranslation (
CGFloat tx,
CGFloat ty
);
CGAffineTransform CGAffineTransformTranslate (
CGAffineTransform t,
CGFloat tx,
CGFloat ty
);
旋轉效果
CGAffineTransform CGAffineTransformMakeRotation (
CGFloat angle
);
CGAffineTransform CGAffineTransformRotate (
CGAffineTransform t,
CGFloat angle
);
縮放效果
CGAffineTransform CGAffineTransformMakeScale (
CGFloat sx,
CGFloat sy
);
CGAffineTransform CGAffineTransformScale (
CGAffineTransform t,
CGFloat sx,
CGFloat sy
);
反轉效果
CGAffineTransform CGAffineTransformInvert (
CGAffineTransform t
);
只對局部產生效果
CGRect CGRectApplyAffineTransform (
CGRect rect,
CGAffineTransform t
);
判斷兩個AffineTrans是否相等
bool CGAffineTransformEqualToTransform (
CGAffineTransform t1,
CGAffineTransform t2
);
獲得Affine Transform
CGAffineTransform CGContextGetUserSpaceToDeviceSpaceTransform (
CGContextRef c
);
下面的函數只起到查看的效果,比如看一下這個用戶空間的點,轉換到設備空間去坐標是多少
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真正的數學行為
這個轉換矩陣其實是一個 3x3的 舉證
如下圖
下面舉例說明幾個轉換運算的數學實現
x y 是原先點的坐標
下面是從用戶坐標轉換到設備坐標的計算公式
下面是一個identity matrix,就是輸入什么坐標,出來什么坐標,沒有轉換
最終的計算結果是 x=x,y=y,
可以用函數判斷這個矩陣是不是一個 identity matrix
bool CGAffineTransformIsIdentity (
CGAffineTransform t
);
參考:http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html
- (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轉換實現的原理:Quartz把繪圖分成兩個部分,
用戶空間,即和設備無關,
設備空間,
用戶空間和設備空間中間存在一個轉換矩陣 : CTM
本章實質是講解CTM
Quartz提供的3大功能
移動,旋轉,縮放
演示如下,首先加載一張圖片
void CGContextDrawImage (
CGContextRef c,
CGRect rect,
CGImageRef image
);
移動函數
CGContextTranslateCTM (myContext, 100, 50);
旋轉函數
include <math.h>
static inline double radians (double degrees) {return degrees * M_PI/180;}
CGContextRotateCTM (myContext, radians(–45.));
縮放
CGContextScaleCTM (myContext, .5, .75);
翻轉, 兩種轉換合成后的效果,先把圖片移動到右上角,然后旋轉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實現3大效果,下面是通過創建Affine Transforms,然后連接ctm實現同樣的3種效果
這樣做的好處是可以重用這個Affine Transforms
應用Affine Transforms 到ctm的函數
void CGContextConcatCTM (
CGContextRef c,
CGAffineTransform transform
);
Creating Affine Transforms
移動效果
CGAffineTransform CGAffineTransformMakeTranslation (
CGFloat tx,
CGFloat ty
);
CGAffineTransform CGAffineTransformTranslate (
CGAffineTransform t,
CGFloat tx,
CGFloat ty
);
旋轉效果
CGAffineTransform CGAffineTransformMakeRotation (
CGFloat angle
);
CGAffineTransform CGAffineTransformRotate (
CGAffineTransform t,
CGFloat angle
);
縮放效果
CGAffineTransform CGAffineTransformMakeScale (
CGFloat sx,
CGFloat sy
);
CGAffineTransform CGAffineTransformScale (
CGAffineTransform t,
CGFloat sx,
CGFloat sy
);
反轉效果
CGAffineTransform CGAffineTransformInvert (
CGAffineTransform t
);
只對局部產生效果
CGRect CGRectApplyAffineTransform (
CGRect rect,
CGAffineTransform t
);
判斷兩個AffineTrans是否相等
bool CGAffineTransformEqualToTransform (
CGAffineTransform t1,
CGAffineTransform t2
);
獲得Affine Transform
CGAffineTransform CGContextGetUserSpaceToDeviceSpaceTransform (
CGContextRef c
);
下面的函數只起到查看的效果,比如看一下這個用戶空間的點,轉換到設備空間去坐標是多少
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真正的數學行為
這個轉換矩陣其實是一個 3x3的 舉證
如下圖
下面舉例說明幾個轉換運算的數學實現
x y 是原先點的坐標
下面是從用戶坐標轉換到設備坐標的計算公式
下面是一個identity matrix,就是輸入什么坐標,出來什么坐標,沒有轉換
最終的計算結果是 x=x,y=y,
可以用函數判斷這個矩陣是不是一個 identity matrix
bool CGAffineTransformIsIdentity (
CGAffineTransform t
);
移動矩陣
縮放矩陣
旋轉矩陣
旋轉加移動矩陣