2009-07-30 61 views
1

我想創建一個自定義的NSView,它採用分層的繪畫方法。我想大多數圖層的寬度和高度與後臺視圖相同。使用Core Animation/CALayer進行簡單的分層繪畫

對於這個任務,使用像CALayer這樣的核心動畫類是否合適,即使我不期望需要太多的動畫?有更合適的方法嗎?

爲了澄清,該視圖並不意味着像Photoshop中的應用程序中的畫布。它更適合用戶交互的數據顯示(選擇,移動,滾動等)

回答

3

如果是之後的顯示和佈局,我會說基於CALayer的架構是一個不錯的選擇。對於開放源代碼Core Plot framework,我們將所有圖形和繪圖元素從CALayers中構建出來,並按常規層次結構進行組織。 CALayers是輕量級的,在Mac和iPhone之間使用幾乎相同的API。他們甚至可以響應觸摸或鼠標事件。

對於基於CALayer的用戶界面的另一個示例,my iPhone application的整個方程式輸入界面由CALayers組成,包括從下方向上滑動的菜單。性能稍好於我以前的基於UIView的實現,但相同的代碼也適用於我的初步桌面版本的應用程序。

2

對於繪圖程序,我會想到保存位圖數據的緩衝區是很重要的。使用CALayer唯一的問題是contents屬性是CGImageRef。爲了進一步繪圖而將其轉換爲圖形上下文可能會有點痛苦。你必須初始化一個新的上下文,在其中繪製位圖數據,然後進行你想要做的任何繪製操作,最後再把它變回CGImageRef。您可能無法避免執行大量內存分配,這實際上可以保證您的程序運行速度減慢。

我會考慮爲每個圖層保留一個屏幕外緩衝區。看看石英CGLayerRef對象。我認爲它可能做你想做的事:它是一個屏幕外的緩衝區,它包含了你可能想要重複繪製的東西。您也可以在需要時快速獲得CGContextRef,以便您可以進行額外的繪圖。如果您想使用Cocoa繪圖方法,您可以始終使用CGContextRefNSGraphicsContext

+0

謝謝你的回答。 我不確定您的「繪圖程序」究竟是什麼意思,但要澄清,該視圖並不意味着像Photoshop中的應用程序中的畫布。它應該允許用戶交互(選擇,移動,滾動等)的數據顯示更多 – 2009-07-30 17:07:07

+0

然後,這取決於您繪製的內容是否可以根據需要輕鬆快速地重繪,或者這是否是一項耗時的操作。在第一種情況下,Core Animation圖層可以正常工作。 CGLayers可以更好地作爲高速緩存來重繪。 – Alex 2009-07-30 19:00:11