iOS基礎 - CALayer

1、CALayer簡介

Core Animation是跨平臺的,支持iOS環境和Mac OS X環境框架

凡是支持跨平臺的框架,都不能直接使用UIKit框架,由於UIKit框架只能應用在iOS而不能用於Mac函數

須要先理解CALayer,由於核心動畫操做的對象是CALayer,而不是UIView性能

CALayer是核心動畫的基礎,能夠作圓角、陰影、邊框等效果動畫

每一個UIView內部都有一個Layer的屬性spa

在實現核心動畫時,本質上是將CALayer中的內容轉換成位圖(一種圖像格式),從而便於圖形硬件的操縱設計

2、UIViewCALayer基本屬性

設置UIView中的CALayer屬性orm

圓角、邊框、陰影及3D形變屬性對象

UIViewCALayer只是一個類聲明,須要添加QuartzCore框架遊戲

在使用顏色時,不能直接使用UIColor而須要將顏色轉成CGColor事件

修改圖層至關於修改UIView屬性,即修改了界面屬性

要設置陰影,須要同時指定陰影的偏移尺寸、顏色和透明度

形變屬性既能夠用形變函數指定,也能夠用keyPath指定

3、UIImageViewCALayer基本屬性

設置UIImageView中的CALayer屬性

圓角、邊框、陰影

UIImageView中不只一個子圖層,所以設置圓角時須要使用setMasksToBounds:YES,讓全部子圖層跟隨邊框,不過設置該屬性後,沒法使用陰影效果

能夠在底層附加一個UIView實現陰影效果

設置UIImageView中的CALayer屬性

transform屬性能夠調整CALayer的形變,其中包括:旋轉、縮放、平移

transform屬性的參數查詢:CATransform

4、圖層和視圖之間的關係

建立視圖對象時,視圖會本身建立一個層,視圖在繪圖(如drawRect:)時,會將內容畫在本身的層上。當視圖在層上完成繪圖後,系統會將圖層拷貝至屏幕(CALayer繪圖的上下文是圖像,整個畫完後,才顯示,提早繪製提升性能以及用戶體驗)。每一個視圖都有一個層,每一個圖層又能夠有多個子層

Layer的設計目的不是爲了取代視圖,不能基於CALayer建立一個獨立的可視化組件

Layer的設計目的是提供視圖的基本可視內容,以便提升動畫的執行效率

除提供可視內容外,Layer不負責視圖的事件響應等工做,同時Layer不能參與到響應者鏈條中

5、CALayer的使用說明

經過UIViewlayer屬性能夠拿到對應的根層,這個層不容許從新建立,但能夠往層裏面添加子層(調用CALayeraddSublayer)

要具體使用CALayer,須要引入<QuartzCore/QuartzCore.h>

獲取當前圖層或使用靜態方法layer初始化CALayer後,能夠設置如下屬性

bounds:寬度和高度

position:位置(默認指中心點,具體由anchorPoint決定)

anchorPoint:錨點(x,y的範圍都是0-1),決定了position的含義

backgroundColor: 背景顏色(CGColorRef類型)

borderColor:邊框顏色(CGColorRef類型)

borderWidth:邊框寬度

cornerRadius:圓角半徑

contents: 內容(好比設置爲圖片CGImageRef

雖然CALayer可使用frame,但最好仍是使用boundsposition。爲層設置動畫時,用boundsposition會方便一點

6、建立自定義圖層

建立自定義圖層,並設置如下屬性:

bounds:寬度和高度

backgroundColor: 背景顏色(CGColorRef類型)

position:位置(默認指中點,具體由anchorPoint決定)

anchorPoint:錨點(x,y的範圍都是0-1),決定了position的含義

contents:內容CGImageRef

錨點和位置的關係,以及在旋轉轉換時對圖層的影響

UIView有一個addSubview方法,而layer有一個addSubLayer方法

錨點在遊戲開發中使用比較頻繁,而在應用開發中極少使用

7、CALayer中圖像及顏色的注意事項

CALayer中使用CGColorRefCGImageRef的數據類型,而不用UIColorUIImage

QuartzCore(包含CALayer類)和Core Graphics(包含CGImageRefCGColorRef)框架都能在iOSMac OS X上使用,可是UIKit(包含UIImage和其餘UI開頭的類)只能在iOS中使用

爲了保證可移植性,QuartzCore不能使用UIImage,只能使用CGImageRef

不過不少狀況下,能夠經過UIKit對象的特定方法,能夠獲得Core Graphics對象,如UIImageCGImage方法和UIColorCGColor方法

8、CALayer的隱式動畫屬性

每個UIView內部都默認關聯着一個CALayer,稱這個LayerRoot Layer。全部的非Root Layer都存在着隱式動畫,隱式動畫的默認時長爲1/4秒。

當修改非Root Layer的部分屬性時,相應的修改會自動產生動畫效果,能執行隱式動畫的屬性被稱爲「可動畫屬性」,諸如:

bounds: 縮放動畫

position: 平移動畫

opacity: 淡入淡出動畫(改變透明度)

在文檔中搜素animatable能夠找到全部可動畫屬性

若是要關閉默認的動畫效果,能夠經過動畫事務方法實現:

[CATransaction begin];

[CATransaction setDisableActions:YES];

[CATransaction commit];

9、在CALayer上繪圖

要在CALayer上繪圖,有兩種方法:

建立一個CALayer的子類,而後覆蓋drawInContext:方法,可使用Quartz2D API在其中進行繪圖

設置CALayerdelegate,而後讓delegate實現drawLayer:inContext:方法進行繪圖

不能再將UIView設置爲這個CALayerdelegate,由於UIView對象已是內部層的delegate,再次設置會出問題

不管使用哪一種方法,都必須向層發送setNeedsDisplay消息,以觸發相應繪圖方法的調用

10、CALayerUIView以及上下文之間的關係

UIView收到setNeedsDisplay消息時,CALayer會準備好一個CGContextRef,而後向它的delegateUIView,發送消息,而且傳入已經準備好的CGContextRef對象。UIViewdrawLayer:inContext:方法中會調用本身的drawRect:方法

平時在drawRect:中經過UIGraphicsGetCurrentContext()獲取的就是由CALayer傳入的CGContextRef對象,在drawRect:中完成的全部繪圖都會填入CALayerCGContextRef中,而後被拷貝至屏幕

CALayerCGContextRef用的是位圖上下文(Bitmap Graphics Context

11、獲取CALayer中的內容——截屏

UIGraphicsBeginImageContext(self.view.bounds.size);

[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

說明:使用renderInContext方法能夠將指定圖層及其子圖層中的內容渲染輸出到指定的上下文中 

相關文章
相關標籤/搜索