如何在UIImageView或CGContext中使用NSUndoManager

4
我有一个使用cgcontext在UIImageView上绘制用户通过触摸事件绘制的东西的应用程序,我希望能够撤消用户所做的绘图。
编辑:
我试图在touchesBegan中将UIImage保存到NSUndoManager中,然后如何使用UIAlertView来撤消它。
也就是说,我想从我的UIAlertView中调用一个方法来撤消,然后再调用另一个方法来重做,但我不知道如何实现。请帮忙。
1个回答

3
我为iPhone编写图形软件(http://www.layersforiphone.com/),并花了一段时间来尝试解决这个问题。问题在于,CGContexts本质上不可撤销。您无法取消填充矩形或恢复已经绘制的部分。数据就是不存在的。根据我的经验,最好的方法是创建一个“保存”方法,查看正在更改的区域,并在执行绘图操作之前将该区域中的图像数据保存到撤消堆栈中。然后,当您决定撤消时,可以获取修改后的区域,并从保存的数据中恢复它。
我选择在Layers中独立实现该方法,而不是使用NSUndoManager,因为您基本上需要一个CGImageRefs和CGRects的堆栈,而这与NSUndoManager不匹配。
注意:从技术上讲,您可以每次修改图像时都保存整个图像的副本。但这是一种浪费内存的做法,因为您可能只更改了一个小区域。如果您想要有慷慨的撤消历史记录(10+步),那么肯定值得您保存和恢复绘图空间中的小子图像。

希望这能有所帮助!我知道这不是一个很好的解决方案 - 你真的不能用内置的API做太多事情。如果你能创建一个通用的解决方案来解决这个问题,我认为很多人会对此感兴趣!


首先,如果您经常处理这些内容,那么您能帮我回答这个问题吗:http://stackoverflow.com/questions/1943325/how-do-i-stroke-a-cgcontext-path-with-multiple-random-images,而且,我想要做的就是将我在m CGContext上绘制的图像保存下来。 - Jab
@Ben:我一直在制作绘图应用程序,撤销/重做功能让我发疯了...就像你所写的:“每次修改时,您可以保存整个图像的副本..”请问您能告诉我如何以及在哪里存储这些图像吗?我可以考虑两种选项来保存临时图像:1)使用缓冲区2)SqlLite数据库。我不知道如何使用缓冲区保存图像,我将尝试第二个选项..如果您能指导我如何保存文件,我将非常感激您的帮助.. - rohan-patel
嗨@Ben:我正在处理一个绘图项目,橡皮擦出了问题,你能否看一下这个链接并给我建议?https://dev59.com/mGbWa4cB1Zd3GeqPTyhC - Ranjit
难怪我无法使用NSUndoManager使其工作。猜想只能回到将单个图像保存在tmp文件夹中,如undo1.png,undo2.png等。谢谢。 - GeneCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接