CALayer(一)

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;

相關文章
相關標籤/搜索