從UIView與Layer的愛恨情仇開始

“在iOS當中,所有的視圖都從一個叫做UIVIew的基類派生而來,UIView可以處理觸摸事件,可以支持基于Core Graphics繪圖,可以做仿射變換(例如旋轉或者縮放),或者簡單的類似于滑”

“CALayer類在概念上和UIView類似,同樣也是一些被層級關系樹管理的矩形塊,同樣也可以包含一些內容(像圖片,文本或者背景色),管理子圖層的位置。它們有一些方法和屬性用來做動畫和變換。和UIView最大的不同是CALayer不處理用戶的交互”
CALayer并不清楚具體的響應鏈,即使它提供了一些方法判斷某個觸點是否在某個范圍內.
“每一個UIview都有一個CALayer實例的圖層屬性,也就是所謂的backing layer,視圖的職責就是創建并管理這個圖層,以確保當子視圖在層級關系中添加或者被移除的時候,他們關聯的圖層也同樣對應在層級關系樹當中有相同的操作。 ”

“但是為什么iOS要基于UIView和CALayer提供兩個平行的層級關系呢?為什么不用一個簡單的層級來處理所有事情呢?原因在于要做職責分離,這樣也能避免很多重復代碼。在iOS和Mac OS兩個平臺上,事件和用戶交互有很多地方的不同,基于多點觸控的用戶界面和基于鼠標鍵盤有著本質的區別,這就是為什么iOS有UIKit和UIView,但是Mac OS有AppKit和NSView的原因。他們功能上很相似,但是在實現上有著顯著的區別。”

雖然蘋果封裝好了一些動畫,方便了我們的使用,但是弊端同樣存在

有一些UIView沒有暴露出來的CALayer的功能:
陰影,圓角,帶顏色的邊框
3D變換
非矩形范圍
透明遮罩
多級非線性動畫

廢話少說,操練起來:

img
img

我曹,好大的圖

來不及解釋,layer的contents屬性,快上車

_whiteView.layer.contents=(__bridge id)[UIImage imageNamed:@"callBg"].CGImage;
CALayer *blueLayer = [CALayer new];
blueLayer.frame = CGRectMake(50, 50, 40, 40);
blueLayer.backgroundColor = [UIColor redColor].CGColor;

UIImage *image = [UIImage imageNamed:@"chat_video_play"];
blueLayer.contents = (__bridge id)image.CGImage;
[_whiteView.layer addSublayer:blueLayer];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容