2010-12-03 67 views
0

我有我的這個應用程序,其中包含一個部分,將允許用戶在屏幕上做簡單的繪畫。我的想法是提供兩種繪畫:粗糙和平滑(更加卑鄙)的線條。iPhone - 試圖找出drawRect:

它是如何構建的:我有一個自定義drawRect方法的透明UIView。我不確定我是否完全理解drawRect,但代碼部分工作。

工作原理:用戶在屏幕上移動手指。當他第一次觸摸屏幕時,TouchesBegan會創建一個名爲myPoints的可變數組,並存儲第一個點的座標並保存畫布(以允許撤消)。

之後,TouchesMoved例程抓取所有點並將它們添加到myPoints。在用戶選擇繪製貝塞爾線的情況下,需要此數組。

當檢測到touchesEnded時,應用程序必須查看用戶是否正在繪製常規線(粗糙)或貝塞爾曲線。如果不是更加困難,這些線條已經被繪製出來了。如果需要一個貝塞爾曲線,我需要擦除畫布,恢復畫布,就像TouchesBegan存儲它時一樣,計算新的貝塞爾近似(反向設計成最適合貝塞爾曲線以適合繪製的點)並繪製新曲線,取代粗糙的一個。

這些是我的問題:

1)如何存儲撤消?我首先想到創建一個新的圖層來存儲撤消,但這樣做會將應用程序內存使用量從8 Mb增加到13 Mb ......我不確定這是否是安全的使用級別(該應用程序與3GS兼容,iPod觸摸2nd G,包括iPad)。然後,我決定啓動一個隊列操作來保存畫布。這會導致保存空白圖像(我認爲保存方法對於上下文而言是無效的,因爲它無法獲取drawRect之外的上下文)。

2)第二個問題與第一個類似。此時我需要將畫布恢復到保存時的狀態,但由於恢復方法在drawRect之外,因此它也無法使用上下文。

TouchesBegan,TouchesMoved和TouchesEnded以及所提及的所有方法都在drawRect所在的同一類中,而不在viewController中。

我的問題是:你們會怎麼做?

我在商店看到一款繪畫應用程序,提供多級撤消。我無法想象他們是如何做到這一點的,因爲在我第一次嘗試的時候,因爲我創建的圖層消耗了5 Mb的內存,所以看起來不可能有那種類型的內存...

please,help me .. 。 我很絕望!

感謝

回答

1

任何原因,你爲什麼要存儲「畫布」? (我認爲這將是你正在繪製的圖像是正確的?)

我想你想要做的是將可繪製對象(粗線,貝塞爾等)存儲在一些對象中, 「路徑」,然後你有一個集合(即nsmutablearray)與所有可繪製對象....然後drawRect將該集合並將其繪製到屏幕上。

可以實現撤消,因此當用戶想要撤消時,您從集合中刪除最後一個可繪製對象或添加到集合中的最後一個點並重繪...

您不能在drawRect之外獲取繪圖上下文,但您只需要更新數據結構(點,可繪製對象等),並通過調用[self setNeedsDisplay]來使控件「無效」 OS調用你的drawRect,然後你可以在屏幕上繪製你的對象。

編輯:

我創造概念的應用程序的一個簡單證明(在C#中的WinForms ...我沒有訪問我的Mac的權利,但是很簡單的理解這個概念),其工作原理是辦法。示例代碼是在

https://github.com/jaimedp/DrawEraseUndo

注意,這個概念有一些侷限性,如果你變得越來越複雜,例如,如果你看中與線根據手指移動的速度withs時,重畫不能處理這個問題,雖然你可以添加更多的屬性到可繪製的對象來說明更多的幻想。

如果需要,我會將示例移植到iOS。

希望這有助於..

+0

(是的,帆布我指的是圖像)......這個問題是橡皮擦。用戶可以手指擦除部分物體。如果用戶擦除部分線(已存儲的點),我將不得不重新創建擦除。這不是愚蠢的嗎?這些物體會被完全或部分地反覆繪製和擦除,直到獲得最終的圖像爲止。我不認爲這將是最好的選擇。 – SpaceDog 2010-12-03 23:38:17

+1

實際上,擦除只是集合中的另一個繪圖對象,但使用背景顏色(也可能與之不同)...只需在集合中重新創建圖像時(即刪除最後一項)所有其他操作保存在西蒙娜可見圖像 – Jaime 2010-12-04 03:42:50

1

...我想獲得什麼ü上面說......我最初以爲我會回答得很好......因爲我已經做了類似的東西OK .hold之前..但後來我讀你的整個問題和答案海梅,它使我困惑了很多..但無論如何,從我的解釋..我可以給你一個答案

因此,部分擦除..我是藉助於我存儲在觸摸點中的一系列點的幫助開始畫圖並開始移動......我想你只是那樣畫圖......所以爲了擦除......我暫時清空了我的點數然後調用「setNeedsDisplay」..其中會發現陣列中沒有點,因此將清除所有...

如果你不用粗糙繪圖的數組進行繪圖,那麼我會建議你這樣做。

我也建議一件事..這確定用戶想要粗糙或光滑的曲線應在開始時完成,而不是在「touchesEnded」 ..然後用數組相應繪製...

我希望你知道如何繪製粗糙的曲線和流暢的曲線我會給UA鏈接到我的答案

CGContext Draw Line slowly responding to fast finger movement