2009-12-15 100 views
4

我有一個應用程序,它使用cgcontext繪製事件到用戶使用觸摸事件繪製的UIImageView,並且我希望能夠撤消用戶製作的繪圖。如何使用NSUndoManager與UIImageView或CGContext

編輯:


我想用我的touchesBegan以觸摸的開頭保存theUIImage到NSUndoManager


然後我怎麼使用它來取消使用UIAlertView。
意思是說,我想從我的UIAlertView中調用一個方法,該方法是撤消然後另一個將重做,但我不知道如何完成此操作。
請幫忙

回答

3

我寫的iPhone的圖形軟件(http://www.layersforiphone.com/),我花了一段時間試圖弄清楚這一點。問題是,CGContexts本質上不是「可撤銷的」。您不能填充矩形或恢復您繪製的部分。數據只是不存在。根據我的經驗,最好的辦法是創建一個「保存」方法,查看正在更改的區域,並在執行繪製操作之前將該區域中的圖像數據保存到撤消堆棧。然後,當您決定撤消時,您可以使用修改過的區域並從保存的數據中恢復。

我選擇在圖層中獨立於NSUndoManager實現該方法,因爲您基本上需要一堆CGImageRefs和CGRects,並且它無法很好地映射到NSUndoManager。

注意:從技術上講,每次修改時都可以保存整個圖像的副本。但這是對內存的一種不好的使用 - 因爲你只能改變一小塊區域。如果你想有一個慷慨的撤消歷史(10 +步),絕對值得您在繪圖空間內保存和恢復小的子圖像。

希望有幫助!我知道這不是一個好的解決方案 - 你真的無法用內置的API做很多事情。如果你爲這個問題創建一個通用的解決方案,我認爲很多人會對它感興趣,但是!

+0

那麼首先,如果你一直處理這個東西,那麼你能幫助我解決這個問題:http://stackoverflow.com/questions/1943325/how-do-i-stroke-a-cgcontext-path -with-multiple-random-images,還有,我想要做的就是將我正在繪製的CGContext的圖像保存到 – Jaba 2009-12-31 06:09:07

+0

@Ben:我一直在繪製應用程序,撤消/重做功能讓我發瘋。正如你寫的那樣:「每次修改時你都可以保存整個圖像的副本。」你能否告訴我們如何以及在哪裏存儲這些圖像?我可以考慮兩個選項來保存用於臨時目的的圖像:1)使用緩衝區2)SqlLite數據庫。 我不知道如何使用緩衝區保存圖像,我要去嘗試第二種選擇.. 如果你能指導我如何保存文件,我將非常感謝你的幫助。 – 2011-07-23 04:35:04

+0

Hi @Ben:我正在使用繪圖項目,我有一個問題,橡皮擦,你可以請看看這個鏈接,並建議我的東西http://stackoverflow.com/questions/11502320/eraser-not-working-in-ios-drawing – Ranjit 2012-07-20 11:11:10