在iOS中,你能看得見摸得着的東西基本都是UIView,比如一個按鈕,一個標簽,一個文本輸入框,這些都是UIView;
其實UIView之所以能顯示在屏幕上,完全是因為它內部的一個圖層
在創建UIView對象時,UIView內部會自動創建一個圖層(即CALayer對象),通過UIView的layer屬性可以訪問這個圖層
@property(nonatomic,readonly,retain) CALayer *layer;
每一個UIView內部都默認關聯一個CALayer,我們可稱這個Layer為RootLayer(根層)
接下來介紹自定義CALayer的兩種方式:繼承方式,代理方式。在講解這兩種方式之前,先講解一下UIView的顯示過程
每個UIview都是自己內部圖層的代理,代碼解釋為:self.layer.delegate = self; self代表某個View
1.當我們每次創建一個UIView的時候,view.layer首先會准備一個layer類型的上下文
2.調用view.layer.delegate(view本身)-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 方法,並且把第一步准備好的上下文傳遞進來
3.-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx中又會調用-(void)drawRect:(CGRect)rect
4.view 的-(void)drawRect:(CGRect)rect方法就實現繪制東西的代碼,並且繪制的圖像最終會繪制到view.layer上
5.系統將view.layer的內容拷貝到屏幕上,就會完成view的顯示
分析明白上面的過程,我們就很明白當我們自定義UIView的時候,在-(void)drawRect:(CGRect)rect編寫繪圖代碼的時候,首先通過UIGraphicsGetCurrentContext() 獲取-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx方法中傳遞進來的上下文,
接下來講解通過繼承方式自定義CALayer
1.首先創建一個類,繼承CALayer
2 在HFLayer.m中
在這個方法中,可以繪制圖形
接下來,
可以發現,通過我們自定義的Layer類創建出來的layer對象,里面自帶了一個圓,這個圓就是-(void)drawInContext:(CGContextRef)ctx中繪制的圖形
第二種:通過代理的方式自定義layer
設置完代理對象以后,調用-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
這個時候,看效果圖
大家肯定有疑惑的地方,第一:layer.delegate = self;為什么不用遵守協議?就會有-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx方法
layer 的代理屬性沒有協議;我們經常見到的一般都是
這種代理屬性。
第二:UIView 和 Layer都有 setNeedDisplay 重繪的方法。
無論哪一種自定義layer的方式,最后都要記得重繪,不然會沒有效果;
大家只要會用這兩種自定義layer的方式就可以了,深究原理,我也是不太懂,只是懂個大概。
有的同學會說圓的位置怎么不在layer的中心,這個是因為坐標設置的原因,修改一下坐標點就會在中間了;
大家可以看出,layer同樣可以做到和UIImageView一樣的效果。都可以顯示東西;那么到底使用layer還是UIImagView呢?
這個要看實際功能,如果只是顯示圖片的話,不需要與用戶交互。就可以用Layer,因為Layer只負責顯示圖像,少了與用戶的交互,可以提高性能;
如果顯示的圖片要與用戶進行交互的話,就只能用UIView來處理了,不能使用Layer了;