CGAffineTransform和CATransform3D

上周沒(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.
1.1
如上圖,用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的矩陣.
2.1
和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;
}

OK 終于寫(xiě)完了~~~~ 希望各位客官多多提建議

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末办斑,一起剝皮案震驚了整個(gè)濱河市蹋岩,隨后出現(xiàn)的幾起案子赖草,更是在濱河造成了極大的恐慌,老刑警劉巖剪个,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異版确,居然都是意外死亡扣囊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)绒疗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)侵歇,“玉大人,你說(shuō)我怎么就攤上這事吓蘑√杪牵” “怎么了坟冲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)溃蔫。 經(jīng)常有香客問(wèn)我健提,道長(zhǎng),這世上最難降的妖魔是什么伟叛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任私痹,我火速辦了婚禮,結(jié)果婚禮上统刮,老公的妹妹穿的比我還像新娘紊遵。我一直安慰自己,他們只是感情好侥蒙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布暗膜。 她就那樣靜靜地躺著,像睡著了一般鞭衩。 火紅的嫁衣襯著肌膚如雪桦山。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天醋旦,我揣著相機(jī)與錄音恒水,去河邊找鬼。 笑死饲齐,一個(gè)胖子當(dāng)著我的面吹牛钉凌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捂人,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼御雕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了滥搭?” 一聲冷哼從身側(cè)響起酸纲,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瑟匆,沒(méi)想到半個(gè)月后闽坡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愁溜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年疾嗅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冕象。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡代承,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渐扮,到底是詐尸還是另有隱情论悴,我是刑警寧澤掖棉,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站膀估,受9級(jí)特大地震影響幔亥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玖像,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一紫谷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捐寥,春花似錦笤昨、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乡洼,卻和暖如春崇裁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背束昵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工拔稳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锹雏。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓巴比,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親礁遵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轻绞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348