上周沒(méi)有分享,因?yàn)樯现芊偶?哈哈哈哈哈哈哈~~!!!!!! 這周本來(lái)是想分享CAShapeLayer CATextLayer CATransformLayer這些Layer的子類(lèi)的,但是我發(fā)現(xiàn)后面做變化的時(shí)候可能會(huì)用到今天的這個(gè)東西,就先拿出來(lái)說(shuō)一下.
一.CGAffineTransform 仿射變換
CG(CoreGraphics框架) Affine(仿射) Transform(變化) 可想而知CGAffineTransform是CoreGraphics框架提供的一個(gè)類(lèi).UIView有一個(gè)transform的屬性,這個(gè)屬性的類(lèi)型就是CGAffineTransform類(lèi)型,用于在二維空間做旋轉(zhuǎn),縮放和平移.而CGAffineTransform是一個(gè)可以和二維空間向量(例如CGPoint)做乘法的3X2的矩陣,layer的affineTransform的屬性也是CGAffineTransform.
如上圖,用CGPoint的每一列和CGAffineTransform矩陣的每一行對(duì)應(yīng)元素相乘再求和,就形成了一個(gè)新的CGPoint類(lèi)型的結(jié)果.要解釋一下圖中顯示的灰色元素,為了能讓矩陣做乘法,左邊矩陣的列數(shù)一定要和右邊矩陣的行數(shù)個(gè)數(shù)相同,所以要給矩陣填充一些標(biāo)志值,使得既可以讓矩陣做乘法,又不改變運(yùn)算結(jié)果,并且沒(méi)必要存儲(chǔ)這些添加的值,因?yàn)樗鼈兊闹挡粫?huì)發(fā)生變化,但是要用來(lái)做運(yùn)算.
簡(jiǎn)單的仿射變換:
CGAffineTransformMakeRotation(CGFloat angle)
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)
混合仿射變化:
CGAffineTransformRotate(CGAffineTransform t, CGFloat angle)
CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy)
CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty)
創(chuàng)建一個(gè)CGAffineTransform類(lèi)型的空值,矩陣論中稱(chēng)作單位矩陣,Core Graphics同樣提供了一個(gè)方便的常量:
CGAffineTransformIdentity
最后,如果需要混合兩個(gè)已經(jīng)存在的變換矩陣若专,就可以使用如下方法,在兩個(gè)變換的基礎(chǔ)上創(chuàng)建一個(gè)新的變換
CGAffineTransformConcat(CGAffineTransform t1, CGAffineTransform t2);
接下來(lái)上代碼
/**
*
CGAffineTransform,屬于CoreGraphics框架中的一個(gè)類(lèi).
UIView有一個(gè)transform的屬性,這個(gè)屬性的類(lèi)型就是CGAffineTransform類(lèi)型,用于在二維空間做旋轉(zhuǎn)莺戒,縮放和平移.CGAffineTransform是一個(gè)可以和二維空間向量(例如CGPoint)做乘法的3X2的矩陣,layer的affineTransform的屬性也是CGAffineTransform.
簡(jiǎn)單仿射變化:
CGAffineTransformMakeRotation(CGFloat angle)
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)
混合仿射變化:
CGAffineTransformRotate(CGAffineTransform t, CGFloat angle)
CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy)
CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty)
*/
@interface ViewController ()
@end
@implementation ViewController
-(UIView *)getTest{
UIView *view = [[UIView alloc]init];
view = [[UIView alloc]init];
view.backgroundColor = [UIColor cyanColor];
return view;
}
- (void)viewDidLoad {
[super viewDidLoad];
//view簡(jiǎn)單仿射變換
UIView *testV1 = [self getTest];
testV1.frame = CGRectMake(100, 50, 100, 100);
[self.view addSubview:testV1];
testV1.transform = CGAffineTransformMakeRotation(M_PI_4);
//layer簡(jiǎn)單仿射變換
UIView *testV2 = [self getTest];
testV2.frame = CGRectMake(100, 200, 100, 100);
[self.view addSubview:testV2];
testV2.layer.affineTransform = CGAffineTransformMakeRotation(M_PI_4);
//混合仿射變化
//創(chuàng)建一個(gè)CGAffineTransform類(lèi)型的空值,矩陣論中稱(chēng)作單位矩陣,CoreGraphics同樣提供了一個(gè)方便的常量 CGAffineTransformIdentity
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformScale(transform, 0.5, 0.5);
transform = CGAffineTransformRotate(transform, M_PI / 180.0 * 30.0);
transform = CGAffineTransformTranslate(transform, 200, 0);
UIView *testV3 = [self getTest];
testV3.frame = CGRectMake(100, 350, 100, 100);
[self.view addSubview:testV3];
testV3.transform = transform;
}
二. CATransform3D 3D變換
CATransform3D屬于CoreAnimation框架的一個(gè)類(lèi).可以用來(lái)讓圖層靠近或者遠(yuǎn)離相機(jī)(用戶(hù)視角),transform屬性(CATransform3D類(lèi)型)可以真正做到這點(diǎn),即讓圖層在3D空間內(nèi)移動(dòng)或者旋轉(zhuǎn).和CGAffineTransform類(lèi)似,CATransform3D也是一個(gè)矩陣,但是和2x3的矩陣不同,CATransform3D是一個(gè)可以在3維空間內(nèi)做變換的4x4的矩陣.
和CGAffineTransform矩陣類(lèi)似,Core Animation提供了一系列的方法用來(lái)創(chuàng)建和組合CATransform3D類(lèi)型的矩陣,但是3D的平移和旋轉(zhuǎn)多處了一個(gè)z參數(shù)咳秉,并且旋轉(zhuǎn)函數(shù)除了angle之外多出了x,y,z三個(gè)參數(shù),分別決定了每個(gè)坐標(biāo)軸方向上的旋轉(zhuǎn)
CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz)
CATransform3DMakeTranslation(Gloat tx, CGFloat ty, CGFloat tz)
m34
CATransform3D的m34元素,用來(lái)做透視m34的默認(rèn)值是0,我們可以通過(guò)設(shè)置m34為-1.0 / d來(lái)應(yīng)用透視效果,d代表了想象中視角相機(jī)和屏幕之間的距離,以像素為單位實(shí)際上并不需要,大概估算一個(gè)就好了.因?yàn)橐暯窍鄼C(jī)實(shí)際上并不存在,所以可以根據(jù)屏幕上的顯示效果自由決定它的防止的位置.通常500-1000就已經(jīng)很好了,但對(duì)于特定的圖層有時(shí)候更小后者更大的值會(huì)看起來(lái)更舒服,減少距離的值會(huì)增強(qiáng)透視效果,所以一個(gè)非常微小的值會(huì)讓它看起來(lái)更加失真,然而一個(gè)非常大的值會(huì)讓它基本失去透視效果.
繼續(xù)上代碼
-(UIView *)getTest{
UIView *view = [[UIView alloc]init];
view = [[UIView alloc]init];
view.backgroundColor = [UIColor cyanColor];
return view;
}
- (void)viewDidLoad {
[super viewDidLoad];
UIView *test1 = [self getTest];
test1.frame = CGRectMake(100, 100, 100, 100);
[self.view addSubview:test1];
CATransform3D transform = CATransform3DIdentity;
transform.m34 = - 1.0 / 500.0;
transform = CATransform3DRotate(transform, M_PI_4, 0, 1, 0);
test1.layer.transform = transform;
}