【发布时间】:2012-03-20 15:32:04
【问题描述】:
我有一个绘图应用程序,我想在其中实现 UNDO 功能,以便用户可以撤消已完成的最后一次绘图。
你能告诉我这是怎么做的吗?
谢谢
【问题讨论】:
-
请添加更多详细信息。
标签: iphone objective-c ios cocoa-touch
我有一个绘图应用程序,我想在其中实现 UNDO 功能,以便用户可以撤消已完成的最后一次绘图。
你能告诉我这是怎么做的吗?
谢谢
【问题讨论】:
标签: iphone objective-c ios cocoa-touch
-(void)undoButtonClicked
{
if([pathArray count]>0){
UIBezierPath *_path=[pathArray lastObject];
[pathArray removeLastObject];
[bufferArray addObject:_path];
[self setNeedsDisplay];
}
}
【讨论】:
首先请说明你用什么来画画。您是否使用任何 API 或核心图形框架进行绘图。
这是我找到的链接中的一些方法。
方法:
在 touchesEnded 时,将图像保存到应用程序沙箱,名称如.. 1.png、2.png 等,然后计算“撤消”变量。当用户按下撤消时,只需根据计数加载旧图像。 (这是我能粗略想到的,但还没有完成它的编码,但听起来编码很简单)。
NSUndoManager。
希望这对其他想要这样做的人有所帮助。
参考链接:
http://www.iphonedevsdk.com/forum/iphone-sdk-development/46996-drawing-app-how-do-undo.html
干杯
【讨论】:
这取决于很多事情,您必须更具体地说明您使用的是什么绘图方法,例如,如果您正在谈论“铅笔”笔划并且您的绘图方法使用石英来绘制一些东西,而您只是对最后的笔划或更改感兴趣,您始终可以保存当前的图形上下文(图像上下文或其他内容)并在撤消的情况下显示它。如果要允许撤消多个笔划,则必须将它们添加到数组中,以便重新绘制撤消。如果您使用的是 open gl,那么它也不同。
【讨论】:
非 iPhone 专用
像素画布:
您的选择是将整个画布或被笔划覆盖的区域的快照保存在堆栈中。 撤消操作会弹出您的撤消堆栈并重绘您堆叠的缓冲区。
不方便的是适当调整撤消限制的大小以避免占用内存。
矢量图:
这几乎是微不足道的......
【讨论】:
我的简单解决方案是, 1. 存储 CGPath 。 2.可以使用clear blend mode绘制路径来清除它。
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
【讨论】: