iOS 自定義layer的兩種方式


在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了;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM