老早就知道了這本書,可惜國內只有英文版的。而本人對于自己的英文水平還是有點自知之明的,就算硬著頭皮從亞馬遜上買來看,估計也只能起催眠書籍的作用了。還好在GitHub上看到了這本書籍的翻譯項目,雖然說是大伙合作翻譯來的,不過對于我來說還是求之不得的了,給上項目地址。這里會就自己讀書過程中的體會做一個筆記,希望整本書讀完后會有一個全新的認識。
??沒讀這本書之前,我對UIView與CALayer的理解還是很抽像的:UIView是對CALayer的上層封裝,主要負責處理與用戶觸摸輸入有關的邏輯,而CALayer主要負責控件的具體繪制過程,但具體到細節,就不甚了解了。那接下我們這來了解一些細節吧。
frame與bounds
我們知道UIView有frame與bounds兩個屬性,frame表示View相對于其父View坐標系所在的位置,而bounds是相對于其自身坐標系。但當我們對圖層作變換時,如旋轉或縮放,frame實際上代表了覆蓋在圖層旋轉之后的整個軸對齊的矩形區域。也就是說frame的寬高與bounds的寬高可能就不在一致了,如下圖:autoresize
我們對UIView可以使用UIViewAutoresizingMask或者NSLayoutConstraint來實現自動布局功能。但對于CALayer,我們只能手動的來處理了,最簡單的實現方式是實現CALayerDelegate中以下接口了:
- (void)layoutSublayersOfLayer:(CALayer *)layer;
這也是為什么最好使用視圖而不是單獨的圖層來構建應用程序的重要原因之一。
視覺效果
UIView上的圓角、邊框、陰影等效果實際上就是通過CALayer來實現的,參考代碼如下:
//設置layerView顯示圓角
self.layerView.layer.masksToBounds = YES;
//設置圓角曲律
self.layerView.layer.cornerRadius=4.0f;
//邊框寬度
self.layerView.layer.borderWidth = 1.0f;
//邊框顏色
self.layerView.layer.borderColor = (__bridge id)[UIColor redColor].CGColor;
//陰影方向與距離
self.layerView.layer.shadowOffset = CGSizeMake(0.0f, 5.0f);
//陰影的模糊度
self.layerView1.layer.shadowRadius = 5.0f;
專有圖層
這一章介紹了CALayer的幾個子類,它們有著各自的用途,這里說下幾個比較常用的Layer。
CASharpLayer
CASharpLayer是一個通過矢量圖形而不是bitmap來繪制的圖形子類。它通過CGPath來定義想要繪制的圖形,指定諸如顏色、線寬等屬性后,Layer就繪制出來了。相比起普通的CALayer,CASharpLayer有著如下的優勢:
- 渲染快速:CASharpLayer使用了硬件加速,繪制速度比CALayer快很多。
- 高效使用內存:不像普通的CALayer一樣需要創建寄宿圖來繪制,因此內存使用上會少很多。
- 不會被圖層邊界裁掉:CASharpLayer可以在邊界之外繪制。
CATextLayer
CATextLayer是一個提供類似于UILabel功能的圖層類,但它的渲染速度要比UILabel快很多,且可以使用它來實現富文本的渲染。
CAGradientLayer
CAGradientLayer用于生成兩種或者多種顏色的平滑漸變的,它同樣也使用了硬件加速。效果如下圖:總結
本篇主要對CoreAnimation一書的前六章內容做了簡單的筆記。各Layer具體的使用方法還需要閱讀書籍并在實際工作中學習與使用。有關動畫的部分將在下篇文章中給出。