原文:http://www.kancloud.cn/manual/ios/97759
一、圖層樹(shù)
Core Animation其實(shí)是一個(gè)令人誤解的命名。你可能認(rèn)為它只是用來(lái)做動(dòng)畫(huà)的旁理,但實(shí)際上它是從一個(gè)叫做Layer Kit這么一個(gè)不怎么和動(dòng)畫(huà)有關(guān)的名字演變而來(lái)裤园,所以做動(dòng)畫(huà)這只是Core Animation特性的冰山一角刁笙。
Core Animation是一個(gè)復(fù)合引擎,它的職責(zé)就是盡可能快地組合屏幕上不同的可視內(nèi)容叠纹,這個(gè)內(nèi)容是被分解成獨(dú)立的圖層,存儲(chǔ)在一個(gè)叫做圖層樹(shù)的體系之中敞葛。于是這個(gè)樹(shù)形成了UIKit以及在iOS應(yīng)用程序當(dāng)中你所能在屏幕上看見(jiàn)的一切的基礎(chǔ)誉察。
為什么iOS要基于UIView和CALayer提供兩個(gè)平行的層級(jí)關(guān)系呢?為什么不用一個(gè)簡(jiǎn)單的層級(jí)來(lái)處理所有事情呢惹谐?原因在于要做職責(zé)分離持偏,這樣也能避免很多重復(fù)代碼。在iOS和Mac OS兩個(gè)平臺(tái)上氨肌,事件和用戶交互有很多地方的不同鸿秆,基于多點(diǎn)觸控的用戶界面和基于鼠標(biāo)鍵盤(pán)有著本質(zhì)的區(qū)別,這就是為什么iOS有UIKit和UIView怎囚,但是Mac OS有AppKit和NSView的原因卿叽。他們功能上很相似,但是在實(shí)現(xiàn)上有著顯著的區(qū)別恳守。
這里有一些UIView沒(méi)有暴露出來(lái)的CALayer的功能:
陰影考婴,圓角,帶顏色的邊框
3D變換
非矩形范圍
透明遮罩
多級(jí)非線性動(dòng)畫(huà)
二井誉、CALayer的寄宿圖(即圖層中包含的圖)
和UIImage不同蕉扮,CGImage沒(méi)有拉伸的概念。當(dāng)我們使用UIImage類去讀取我們的雪人圖片的時(shí)候颗圣,他讀取了高質(zhì)量的Retina版本的圖片喳钟。但是當(dāng)我們用CGImage來(lái)設(shè)置我們的圖層的內(nèi)容時(shí),拉伸這個(gè)因素在轉(zhuǎn)換的時(shí)候就丟失了在岂。不過(guò)我們可以通過(guò)手動(dòng)設(shè)置contentsScale來(lái)修復(fù)這個(gè)問(wèn)題
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad]; //load an image
UIImage *image = [UIImage imageNamed:@"Snowman.png"]; //add it directly to our view's layer
self.layerView.layer.contents = (__bridge id)image.CGImage; //center the image
self.layerView.layer.contentsGravity = kCAGravityCenter;
//set the contentsScale to match image
self.layerView.layer.contentsScale = image.scale;
}
@end
三奔则、圖層幾何學(xué)
- 點(diǎn) —— 在iOS和Mac OS中最常見(jiàn)的坐標(biāo)體系。點(diǎn)就像是虛擬的像素蔽午,也被稱作邏輯像素易茬。在標(biāo)準(zhǔn)設(shè)備上,一個(gè)點(diǎn)就是一個(gè)像素,但是在Retina設(shè)備上抽莱,一個(gè)點(diǎn)等于2*2個(gè)像素范抓。iOS用點(diǎn)作為屏幕的坐標(biāo)測(cè)算體系就是為了在Retina設(shè)備和普通設(shè)備上能有一致的視覺(jué)效果。
- 像素 —— 物理像素坐標(biāo)并不會(huì)用來(lái)屏幕布局食铐,但是仍然與圖片有相對(duì)關(guān)系匕垫。UIImage是一個(gè)屏幕分辨率解決方案,所以指定點(diǎn)來(lái)度量大小虐呻。但是一些底層的圖片表示如CGImage就會(huì)使用像素象泵,所以你要清楚在Retina設(shè)備和普通設(shè)備上,他們表現(xiàn)出來(lái)了不同的大小斟叼。
- 單位 —— 對(duì)于與圖片大小或是圖層邊界相關(guān)的顯示偶惠,單位坐標(biāo)是一個(gè)方便的度量方式, 當(dāng)大小改變的時(shí)候朗涩,也不需要再次調(diào)整忽孽。單位坐標(biāo)在OpenGL這種紋理坐標(biāo)系統(tǒng)中用得很多,Core Animation中也用到了單位坐標(biāo)馋缅。