CALayer並不清楚具體的響應鏈,並不可以響應事件,即時提供了一些方法來判斷是否一個觸點在圖層的範圍以內。app
1、寄宿圖函數
CALayer類能夠包含一張圖片,即寄宿圖(圖層中包含的圖)。佈局
(1)contents屬性orm
此屬性類型被定義爲id,原則上給它賦值任何值,app仍能編譯成功,但事實是若是給contents賦的不是CGImage,那麼獲得的圖層將會是空白的。之因此這個屬性被定義爲id類型,是由於在Mac OS系統上,這個屬性對CGImage和NSImage類型的值都起做用。事件
給圖層的寄宿圖賦值時,須要經過bridge關鍵字轉換,例如:圖片
layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"1.jpg"].CGImage);ip
用此屬性賦值圖片,圖片可能顯示得不是很正常,好比拉伸,好像被壓縮的樣子;如果用UIImageView賦值的話,解決此問題就是設置contentMode屬性;it
在CALayer中與contentMode對應的屬性叫作contentsGravity,是個NSString類型,可選的常量值有:io
kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
kCAGravityResize編譯
kCAGravityResizeAspect
kCAGravityResizeAspectFill
(2)contentScale
定義了寄宿圖額像素尺寸和視圖比例大小,默認狀況下是一個值爲1.0的浮點數。可是此屬性並非總會對屏幕上的寄宿圖有影響;這是由於contents因爲設置了contentsGravity屬性,
若是隻是想單純的放大圖層的contents圖片,可使用圖層的transform和affineTransform屬性來達到效果。
若是contentsScale設置爲1.0,將會以每一個點1個像素繪製圖片,若是設置爲2.0,則會以每一個點2個像素繪製圖片,這就是咱們熟知的Retina屏幕。
(3)maskToBounds
在有些狀況下,圖片會超出控件的邊界,在UIView有一個clipsToBounds的屬性能夠用來決定是否顯示超出邊界內容,CALayer對應的屬性爲maskToBounds
(4)contentsRect
此屬性能夠在圖層邊框裏顯示寄宿圖的一個子域,比contentsGravity靈活得多;contentsRect使用的是單位座標,其值爲0到1。
(5)contentsCenter
此屬性爲CGRect類型,它定義了一個固定的邊框和一個在圖層上可拉伸的區域。 改變contentsCenter的值並不會影響到寄宿圖的顯示,除非這個圖層的大小改變了。
默認狀況下,contentsCenter是{0, 0, 1, 1}。
設置此屬性顯示的效果和UIImage裏的-resizableImageWithCapInsets: 方法效果很是相似。
2、佈局
CALayer中的佈局屬性有frame、bounds、position;center和position都表明了相對於父圖層anchorPoint(錨點)所在的位置。
(1)錨點
圖層的anchorPoint經過position來控制它的frame的位置;默認座標是{0.5, 0.5}.
(2)Hit Testing
CALayer雖然不能響應事件,可是擁有一些方法能夠處理事件:
-containsPoint:若是這個點在圖層frame範圍內就返回YES
-hitTest:此方法接收一個CGPoint類型參數,返回的是圖層自己,或者包含這個座標點的葉子節點圖層,注意當調用圖層的-hitTest:方法時,測算的順序嚴格依賴於圖層樹當中的圖層順序(和UIView處理事件相似)。
(3)自動佈局
如果想要控制CALayer的佈局,最簡單的方法就是用CALayerDelegate以下函數:
- (void)layoutSublayersOfLayer:(CALayer *)layer;
當圖層的bounds發生改變,或者圖層的-setNeedsLayout方法被調用的時候,這個函數將會被執行。
參考自iOS Core Animation;