2009-12-30 104 views
1

我正在開發使用核心圖形的iphone圖表應用程序。我的要求如下。 我已經在drawRect方法中實現了我所有的繪圖功能。當在圖表中發生某些更新時,我需要調用[self setNeedsDisplay:true]並從開始調用drawRect方法(意味着它執行drawRectMethod中的所有方法,因此在觸摸事件中繪圖不太平滑。我需要在drawRect方法中繪製一些特定的部分,而不是所有的核心圖形?這可能與核心圖形?繪製在單獨的圖層 - 客觀的c核心圖形

回答

2

不清楚你的意思是「單獨的圖層」,但從你的問題我會認爲你的意思-drawRect:目前是一個很大且複雜的函數,它會進行大量的計算,所以運行速度太慢,因爲它會被調用很多,你不提到CALayer,所以我假設你並不是指這裏的實際層。解決方法是將計算結果從0123中移出。只有在數據實際發生變化時,才能計算出所需的一切。在-drawRect:你應該使用預先計算的值,這應該快得多。

例如,既然您提到了Core Graphics,我假設您使用的是CGPath之類的東西。您應該只在數據更改時計算您的CGPath,然後將CGPath存儲爲ivar。你應該只是你的CGPath在-drawRect:。如果CGPath特別複雜(因此速度較慢),您甚至可能需要將其預渲染爲CGImage,然後合成CGImage。

儘可能在iPhone上,應該完全避免使用Core Graphics,而是在Photoshop中預先渲染圖像並將它們保存在Resources文件夾中。 3G並不需要計算能力才能跟上覆雜的Core Graphics處理。這是蘋果公司近期在Mac上的建議的逆轉,它不鼓勵使用預先渲染的圖像,並鼓勵漸變和路徑,而3GS由於處理器速度更快而不那麼重要,但仍是目前對iPhone的建議,並且可能會在他們發佈更高分辨率的iPhone顯示器之前。如果您有動態圖像,這當然是不可能的,但是您應該記住靜態圖像。

編輯:

首先,如果可行的話,請確保你只畫那些髒的部位。 -drawRect:傳遞給你一個髒矩形。如果一個特定的元素不與那個矩形相交,那麼你不需要重繪它。同樣,您應該使用-setNeedsDisplayInRect:來指示哪些部分需要更新。如果您可以輕鬆地將視圖分解爲不重疊的矩形(或偶爾重疊的矩形),那麼這很有效。

如果你有一個視圖是由各個重疊組件組成,你想獨立計算,那麼你可以在CALayer上繪製每個組件,然後將這些圖層附加到視圖上(可能在視圖本身上不畫任何東西)。然後,您可以在已更改的圖層上調用-setNeedsDisplay。這是我可能用於垂直線的例子。我會創建一個CALayer視圖的寬度和高度,將其背景顏色設置爲線條顏色,並將其附加到所需位置的視圖。然後移動這條線非常快(甚至可以使用變換來旋轉它),稍後移除線條也很簡單。如果你想要更奇特的線條繪畫(消除鋸齒等),你當然可以使圖層變寬,並在圖層內繪製線條。如果需要,該圖層可以與視圖一樣大。

Core Animation Programming Guide有關於CALayer以及如何使用它的大量文檔。