概念:
UIView:UIView就是在屏幕上顯示的一個(gè)矩陣塊寸谜,具有層級(jí)關(guān)系朽褪,支持相互嵌套窍霞≌中可以處理觸摸事件(iOS通過(guò)視圖層級(jí)關(guān)系傳遞觸摸事件)啊央,可以支持基于Core Graphics繪圖,可以做旋轉(zhuǎn)或者縮放等仿射變化涨醋,以及一些類似于滑動(dòng)或者漸變的簡(jiǎn)單動(dòng)畫(huà)瓜饥。
CALayer:CALayer在概念上和UIView相似,同樣也是一些被層級(jí)關(guān)系樹(shù)管理的矩陣塊浴骂,同樣也可以包含一些內(nèi)容(像圖片乓土、文本或者背景色)。它有一些方法和屬性可以用來(lái)做動(dòng)畫(huà)和交換溯警。它和UIView最大的不同是趣苏,它不處理用戶的交互。
關(guān)系:
每一個(gè)UIView都持有一個(gè)CALayer實(shí)例的圖層屬性愧膀。視圖需要?jiǎng)?chuàng)建并管理這個(gè)圖層拦键。以確保當(dāng)子視圖被添加或者移除時(shí),子視圖的圖層也對(duì)應(yīng)的從圖層樹(shù)中被添加或者移除檩淋。而CALayer才是真正用來(lái)在屏幕上顯示和處理動(dòng)畫(huà)的芬为。UIView僅僅是對(duì)它的一個(gè)封裝萄金,并提供了Core Animation底層方法的高級(jí)接口。
iOS不用一個(gè)簡(jiǎn)單的層級(jí)處理UIView和CALayer的主要原因是為了將職責(zé)分離媚朦,這樣有利于代碼的復(fù)用氧敢。例如,Mac OS基于鼠標(biāo)询张、鍵盤和iOS基于多點(diǎn)觸控在實(shí)現(xiàn)上有著本質(zhì)的區(qū)別孙乖。但繪圖、布局和動(dòng)畫(huà)份氧,卻是兩個(gè)平臺(tái)可以共用的地方唯袄。通過(guò)分離,就可以讓兩個(gè)平臺(tái)共享繪圖蜗帜、布局和動(dòng)畫(huà)的實(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];
效果如下圖所示: