UIKit和Pixels
每一個UIKit中的view都有他自己的CALayer。
每一個圖層都有一個叫像素位圖的后備存儲,有點像一個圖像。這個后備存儲正是被渲染到顯示器上的。
- drawRect:
當你的視圖實現了drawRect:他們這樣工作:
當你調用 setNeedDisplay,UIKit將會在這個視圖上的CALayer上調用setNeedDisplay。這為圖層設置了一個標識,標記為dirty(臟標記),但還是顯示原來的內容,沒做任何工作,所以調用多次setNeedDisplay是不會有性能損失的。
下面當渲染系統準備好時(也就是當然的runloop即將結束時),它將會調用視圖圖層的display方法。此時,圖層會裝配它的后備存儲(像素位圖)。
然后建立一個Core Graphics上下文(CGContextRef),將后備存儲對應內存中的數據恢復出來,繪圖會進入對應的內存區域,并使用CGContextRef繪制。
UIView調用setNeedDispaly方法后,實際上并沒有發生當前視圖的繪制工作,而是在之后的某一時刻進行繪制工作。
為什么會在之后的某一時機進行繪制工作呢?
UIView 調用setNeedDisplay之后,系統會調用view對應的layer的setNeedDisplay方法,相當于在當前的layer上打上了一個臟標記,然后在當前runloop結束的時候調用CALayer的display方法,才會真正進入當前視圖的繪制流程中,所以試圖的繪制時機,當前runloop即將結束時開始CALayer的display的內部實現:
首先會判斷layer的delegate是否響應display方法,如果不響應就會進入到系統的繪制流程當中。如果響應,實際上就為我們呢提供了異步繪制的接口,這樣就構成了UIView的繪制原理。
、