給contents賦CGImage的值不是唯一的設(shè)置寄宿圖的方法哪审。我們也可以直接用Core Graphics直接繪制寄宿圖。能夠通過繼承UIView并實現(xiàn)-drawRect:
方法來自定義繪制协饲。
如果UIView檢測到-drawRect: 方法被調(diào)用了,它就會為視圖分配一個寄宿圖茉稠,這個寄宿圖的像素尺寸等于視圖大小乘以 contentsScale的值而线。
如果你不需要寄宿圖膀篮,那就不要創(chuàng)建這個方法了,這會造成CPU資源和內(nèi)存的浪費誓竿,這也是為什么蘋果建議:如果沒有自定義繪制的任務(wù)就不要在子類中寫一個空的-drawRect:方法谈截。
當(dāng)視圖在屏幕上出現(xiàn)的時候 -drawRect:方法就會被自動調(diào)用。-drawRect:
方法里面的代碼利用Core Graphics去繪制一個寄宿圖毙死,然后內(nèi)容就會被緩存起來直到它需要被更新(通常是因為開發(fā)者調(diào)用了-setNeedsDisplay
方法喻鳄,盡管影響到表現(xiàn)效果的屬性值被更改時,一些視圖類型會被自動重繪再菊,如bounds屬性)颜曾。雖然-drawRect:方法是一個UIView方法,事實上都是底層的CALayer安排了重繪工作和保存了因此產(chǎn)生的圖片绿语。
現(xiàn)在你理解了CALayerDelegate候址,并知道怎么使用它。但是除非你創(chuàng)建了一個單獨的圖層岗仑,你幾乎沒有機會用到CALayerDelegate協(xié)議。因為當(dāng)UIView創(chuàng)建了它的宿主圖層時稳其,它就會自動地把圖層的delegate設(shè)置為它自己,并提供了一個-displayLayer:的實現(xiàn)煤傍,那所有的問題就都沒了。
當(dāng)使用寄宿了視圖的圖層的時候蚯姆,你也不必實現(xiàn)-displayLayer:和-drawLayer:inContext:方法來繪制你的寄宿圖洒敏。通常做法是實現(xiàn)UIView的-drawRect:方法凶伙,UIView就會幫你做完剩下的工作,包括在需要重繪的時候調(diào)用-display方法显押。