標籤:
CALayer的寄宿圖(即圖層中包含的圖)
CALayer 屬性
1.contents:
layer.contents = (__bridge id)image.CGImage;
2.contentGravity:
同UIView contentMode
contentsGravity的目的是為了決定內容在圖層的邊界中怎麼對齊
3.contentsScale
contentsScale屬性其實屬於支援高解析度(又稱Hi-DPI或Retina)螢幕機制的一部分。它用來判斷在繪製圖層的時候應該為寄宿圖建立的空間大小,和需要顯示的圖片的展開度(假設並沒有設定contentsGravity屬性)。
4.maskToBounds
同UIView clipsToBounds
決定是否顯示超出邊界的內容
5.contentsRect
預設的contentsRect是{0, 0, 1, 1},這意味著整個寄宿圖預設都是可見的,如果我們指定一個小一點的矩形,圖片就會被裁剪(2.6)
常用於拼合圖片
6.contentsCenter
類似 UIImage resizableImageWithCapInsets
用Interface Builder 探測視窗控制contentsCenter屬性
contentsCenter其實是一個CGRect,它定義了一個固定的邊框和一個在圖層上可展開的地區
Custome Drawing
給contents賦CGImage的值不是唯一的設定寄宿圖的方法。我們也可以直接用Core Graphics直接繪製寄宿圖。能夠通過繼承UIView並實現-drawRect:方法來自訂繪製。
-drawRect
如果你不需要寄宿圖,那就不要建立這個方法了,這會造成CPU資源和記憶體的浪費
當需要被重繪時,CALayer會請求它的代理給他一個寄宿圖來顯示。它通過調用下面這個方法做到的:
| 1 |
(void)displayLayer:(CALayerCALayer *)layer; |
趁著這個機會,如果代理想直接設定contents屬性的話,它就可以這麼做,不然沒有別的方法可以調用了。如果代理不實現-displayLayer:方法,CALayer就會轉而嘗試調用下面這個方法:
| 1 |
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx; |
在調用這個方法之前,CALayer建立了一個合適尺寸的空寄宿圖(尺寸由bounds和contentsScale決定)和一個Core Graphics的繪製上下文環境,為繪製寄宿圖做準備,他作為ctx參數傳入。
不同於UIView,當圖層顯示在螢幕上時,CALayer不會自動重繪它的內容。它把重繪的決定權交給了開發人員,需要顯式地調用了-display。
儘管我們沒有用masksToBounds屬性,繪製的那個圓仍然沿邊界被裁剪了。這是因為當你使用CALayerDelegate繪製寄宿圖的時候,並沒有對超出邊界外的內容提供繪製支援。
當UIView建立了它的宿主圖層時,它就會自動地把圖層的delegate設定為它自己
UIView和CALayer的座標系
視圖的frame,bounds和center屬性僅僅是存取方法,當操縱視圖的frame,實際上是在改變位於視圖下方CALayer的frame,不能夠獨立於圖層之外改變視圖的frame。
對於視圖或者圖層來說,frame並不是一個非常清晰的屬性,它其實是一個虛擬屬性,是根據bounds,position和transform計算而來,所以當其中任何一個值發生改變,frame都會變化。相反,改變frame的值同樣會影響到他們當中的值
記住當對圖層做變換的時候,比如旋轉或者縮放,frame實際上代表了覆蓋在圖層旋轉之後的整個軸對齊的矩形地區,也就是說frame的寬高可能和bounds的寬高不再一致了。
預設來說,anchorPoint位於圖層的中點,所以圖層的將會以這個點為中心放置。anchorPoint屬性並沒有被UIView介面暴露出來,這也是視圖的position屬性被叫做“center”的原因。
CALayer給不同座標系之間的圖層轉換提供了一些工具類方法:
| 1234 |
- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer; - (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer; - (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;- (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer; |
這些方法可以把定義在一個圖層座標系下的點或者矩形轉換成另一個圖層座標系下的點或者矩形
geometryFlipped
它決定了一個圖層的座標是否相對於父圖層垂直翻轉
CALayer還有另外兩個屬性,zPosition和anchorPointZ,二者都是在Z軸上描述圖層位置的浮點類型。
zPosition最實用的功能就是改變圖層的顯示順序。
zPosition屬性可以明顯改變螢幕層的順序,但不能改變事件傳遞的順序。
iOS-Core-Animation-Advanced-Techniques(一)總結