2013-04-12 72 views
6

View and Window Architecture陳述,報價:的CALayer與drawRect中

意見與核心動畫層協同工作來處理視圖的內容的渲染和動畫。 UIKit 中的每個視圖都由層對象(通常是CALayer類的實例)提供支持,該對象管理視圖的後備存儲並處理與視圖相關的動畫。

的「的觀點圖紙週期」一節中更遠的陳述:

UIView類用來呈現內容點播圖紙模型。當視圖第一次出現在屏幕上時,系統會要求它繪製其內容。 系統捕獲此內容的快照並將該快照用作視圖的視覺表示。

這是否意味着在其drawRect方法調用中的視圖中繪製的內容被保存在其支持核心動畫層中的快照中?

如果不是,該內容快照在哪裏「駐留」?

如果不是,這是否意味着CALayer用於呈現「靜態」內容,不會經常更改的內容,drawRect用於呈現經常更改的內容,例如在遊戲應用程序中?

p.s.

這些問題與任何特定的代碼實現無關。

我只是想了解ios視圖層體系結構。

回答

10

這是否意味着在其drawRect方法調用中在視圖中繪製的內容被保存在其支持核心動畫層中的快照中?

是的。所有東西都使用底層的圖層。 UIView的-drawRect將捕獲你繪製的內容,並且(據我所知)在視圖的子圖層上設置content。它甚至可能在主圖層對象上執行此操作。這就是'快照'被保存的地方。

如果不是這樣,這是否意味着CALayer的用於呈現「靜態」的內容, 內容不經常變化,並drawRect中用於呈現 內容經常發生變化,例如在遊戲中應用程序嗎?

內容更改的頻率不會真正影響選擇。使用drawRect與手動創建CALayer s沒有多大區別。這取決於您希望如何組織視圖中的子元素,或者是否希望創建低級別的可重用圖層對象,而不需要UIView(例如CATextLayer)的詳細信息。如果你有各種不同的子元素進行繪製,那麼你可以用自己的自定義繪圖代碼將它們分成不同的圖層。如果您只需要繪製一個簡單的內容,則可以在一個drawRect實施中完成。儘管如此,你需要知道每一層最終都是一個單獨的GPU「元素」,所以減少你擁有的層數或者使用屬性的性能會有好處。的父層。這將拍攝整個圖層層次結構的快照,並創建一個單獨的光柵化圖像,而不是n個獨立的圖像。

1

這是否意味着在其drawRect方法調用中的視圖中繪製的內容被保存在其支持核心動畫層中的快照中?

兩個詞:「實施細則」

如果不是這樣,這是否意味着CALayer的用於呈現「靜態」的內容,內容不經常改變,並且drawRect中用於呈現經常變化的內容,例如在遊戲應用中?

不完全是。圖層非常擅長動畫內容(如框架名稱Core 動畫所示)。 drawRect適用於高級繪圖,但可能會減慢重繪每一幀(顯然取決於你正在繪製的圖形)。

我沒有在你的問題中看到有關the Core Animation Programming Guide的任何提及。這是瞭解更多關於視圖圖層部分的好地方。

+0

圖層擅長於繪製一次繪製的內容,並且drawRect在每次調用時重繪內容? –

+1

圖層也擅長插值。例如動畫背景顏色,位置,變換,邊框寬度等。 –

0

每個UIView都有一個底層CALayer(實際上是在屏幕上呈現的內容)。

CALayer只是一個位圖(保存像素)。當您將setNeedsDisplay調用到您的視圖時,CALayer會被標記爲重繪。在運行循環結束時,處理事件後,將創建CGContextRef並調用drawRect委託。然後,將事物繪製到創建的上下文中,然後將其複製到位圖中,並最終與其他圖層合成以顯示在屏幕上。

所以,「快照」存儲在CALayer中。這只是一種優化,因此圖層不必重繪自己,除非它們被標記爲重繪(使用setNeedsDisplay)。