一、第一種方式
1.簡單說明
以前想要在view中畫東西,需要自定義view,建立一個類與之關聯,讓這個類繼承自uiview,然後重寫它的drawrect:方法,然後在該方法中畫圖。
繪制圖形的步驟:
(1)擷取上下文
(2)繪制圖形
(3)渲染圖形
如果在layer上畫東西,與上面的過程類似。
代碼示例:
建立一個類,讓該類繼承自calayer

yymylayer.m檔案
在控制器中,建立一個自定義的類
注意點:
(1)預設為無色,不會顯示。要想讓繪制的圖形顯示出來,還需要設定圖形的顔色。注意不能直接使用ui架構中的類
(2)在自定義layer中的-(void)drawincontext:方法不會自己調用,隻能自己通過setneeddisplay方法調用,在view中畫東西drawrect:方法在view第一次顯示的時候會自動調用。
實作效果:
2.拓展
uiview中繪圖說明
說明:在uiview中繪制圖形,擷取的上下文就是這個view對應的layer的上下文。在渲染的時候,就是把圖形渲染到對應的layer上。
在執行渲染操作的時候,本質上它的内部相當于執行了 [self.layer drawincontext:ctx];
二、第二種方式
方法描述:設定calayer的delegate,然後讓delegate實作drawlayer:incontext:方法,當calayer需要繪圖時,會調用delegate的drawlayer:incontext:方法進行繪圖。
注意點:不能再将某個uiview設定為calayer的delegate,因為uiview對象已經是它内部根層的delegate,再次設定為其他層的delegate就會出問題。
在設定代理的時候,它并不要求我們遵守協定,說明這個方法是nsobject中的,就不需要再額外的顯示遵守協定了。
提示:以後如果要設定某個類的代理,但是這個代理沒要求我們遵守什麼特定的協定,那麼可以認為這個協定方法是nsobject裡邊的。
三、補充說明
(1)無論采取哪種方法來自定義層,都必須調用calayer的setneedsdisplay方法才能正常繪圖。
(2)詳細現實過程:
當uiview需要顯示時,它内部的層會準備好一個cgcontextref(圖形上下文),然後調用delegate(這裡就是uiview)的drawlayer:incontext:方法,并且傳入已經準備好的cgcontextref對象。而uiview在drawlayer:incontext:方法中又會調用自己的drawrect:方法。平時在drawrect:中通過uigraphicsgetcurrentcontext()擷取的就是由層傳入的cgcontextref對象,在drawrect:中完成的所有繪圖都會填入層的cgcontextref中,然後被拷貝至螢幕。