概念:
UIView:UIView就是在屏幕上顯示的一個(gè)矩陣塊,具有層級關(guān)系,支持相互嵌套??梢蕴幚碛|摸事件(iOS通過視圖層級關(guān)系傳遞觸摸事件),可以支持基于Core Graphics繪圖,可以做旋轉(zhuǎn)或者縮放等仿射變化,以及一些類似于滑動或者漸變的簡單動畫。
CALayer:CALayer在概念上和UIView相似,同樣也是一些被層級關(guān)系樹管理的矩陣塊,同樣也可以包含一些內(nèi)容(像圖片、文本或者背景色)。它有一些方法和屬性可以用來做動畫和交換。它和UIView最大的不同是,它不處理用戶的交互。
關(guān)系:
每一個(gè)UIView都持有一個(gè)CALayer實(shí)例的圖層屬性。視圖需要創(chuàng)建并管理這個(gè)圖層。以確保當(dāng)子視圖被添加或者移除時(shí),子視圖的圖層也對應(yīng)的從圖層樹中被添加或者移除。而CALayer才是真正用來在屏幕上顯示和處理動畫的。UIView僅僅是對它的一個(gè)封裝,并提供了Core Animation底層方法的高級接口。
iOS不用一個(gè)簡單的層級處理UIView和CALayer的主要原因是為了將職責(zé)分離,這樣有利于代碼的復(fù)用。例如,Mac OS基于鼠標(biāo)、鍵盤和iOS基于多點(diǎn)觸控在實(shí)現(xiàn)上有著本質(zhì)的區(qū)別。但繪圖、布局和動畫,卻是兩個(gè)平臺可以共用的地方。通過分離,就可以讓兩個(gè)平臺共享繪圖、布局和動畫的實(shí)現(xiàn)。
示例:
可以往視圖中添加子視圖,或者往視圖所持有的圖層,添加子圖層。
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 300, 300)];
view.backgroundColor = [UIColor greenColor];
[self.view addSubview:view];
CALayer *subLayer = [[CALayer alloc] init];
subLayer.frame = CGRectMake(0, 0, 80, 80);
subLayer.backgroundColor = [UIColor blueColor].CGColor;
[view.layer addSublayer:subLayer];
效果如下圖所示:
往視圖的圖層上增加子圖層.JPEG