天天看點

iOS開發UI篇—CAlayer(自定義layer)

一、第一種方式

1.簡單說明

以前想要在view中畫東西,需要自定義view,建立一個類與之關聯,讓這個類繼承自uiview,然後重寫它的drawrect:方法,然後在該方法中畫圖。

繪制圖形的步驟:

(1)擷取上下文

(2)繪制圖形

(3)渲染圖形

如果在layer上畫東西,與上面的過程類似。

代碼示例:

建立一個類,讓該類繼承自calayer

iOS開發UI篇—CAlayer(自定義layer)

yymylayer.m檔案

iOS開發UI篇—CAlayer(自定義layer)
iOS開發UI篇—CAlayer(自定義layer)

在控制器中,建立一個自定義的類

iOS開發UI篇—CAlayer(自定義layer)
iOS開發UI篇—CAlayer(自定義layer)

注意點:

(1)預設為無色,不會顯示。要想讓繪制的圖形顯示出來,還需要設定圖形的顔色。注意不能直接使用ui架構中的類

(2)在自定義layer中的-(void)drawincontext:方法不會自己調用,隻能自己通過setneeddisplay方法調用,在view中畫東西drawrect:方法在view第一次顯示的時候會自動調用。

實作效果:

iOS開發UI篇—CAlayer(自定義layer)

2.拓展

  uiview中繪圖說明

iOS開發UI篇—CAlayer(自定義layer)
iOS開發UI篇—CAlayer(自定義layer)

說明:在uiview中繪制圖形,擷取的上下文就是這個view對應的layer的上下文。在渲染的時候,就是把圖形渲染到對應的layer上。

在執行渲染操作的時候,本質上它的内部相當于執行了 [self.layer drawincontext:ctx];

二、第二種方式

方法描述:設定calayer的delegate,然後讓delegate實作drawlayer:incontext:方法,當calayer需要繪圖時,會調用delegate的drawlayer:incontext:方法進行繪圖。

iOS開發UI篇—CAlayer(自定義layer)
iOS開發UI篇—CAlayer(自定義layer)
iOS開發UI篇—CAlayer(自定義layer)

注意點:不能再将某個uiview設定為calayer的delegate,因為uiview對象已經是它内部根層的delegate,再次設定為其他層的delegate就會出問題。

在設定代理的時候,它并不要求我們遵守協定,說明這個方法是nsobject中的,就不需要再額外的顯示遵守協定了。

iOS開發UI篇—CAlayer(自定義layer)

提示:以後如果要設定某個類的代理,但是這個代理沒要求我們遵守什麼特定的協定,那麼可以認為這個協定方法是nsobject裡邊的。

三、補充說明

(1)無論采取哪種方法來自定義層,都必須調用calayer的setneedsdisplay方法才能正常繪圖。

(2)詳細現實過程:

當uiview需要顯示時,它内部的層會準備好一個cgcontextref(圖形上下文),然後調用delegate(這裡就是uiview)的drawlayer:incontext:方法,并且傳入已經準備好的cgcontextref對象。而uiview在drawlayer:incontext:方法中又會調用自己的drawrect:方法。平時在drawrect:中通過uigraphicsgetcurrentcontext()擷取的就是由層傳入的cgcontextref對象,在drawrect:中完成的所有繪圖都會填入層的cgcontextref中,然後被拷貝至螢幕。

繼續閱讀