標籤:
在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了;
iOS 自訂layer的兩種方式