使用 NSUndoManager。但是,如果您在画布上绘制线条,则还需要保留它们的表示(以便可以将它们弹出)。
因此,无论您将它们收集为 UIBezierPath,还是使用形状图层,或者您自己的“点数组”,您都可以以相同的方式撤消。
因此,在绘制线条时,请记录您在绘图中使用的点。当绘图完成时(例如,touchesEnded),您想要“推送”您的绘图,并告诉撤消管理器如何撤消它。简单地说,它就像这样的几乎代码......
- (void)pushDrawing:(Drawing*)drawing
{
[self.stack push:drawing];
[self.undoManager registerUndoWithTarget: self
selector: @selector(popDrawing)
object: nil];
}
- (void)popDrawing:(Drawing*)drawing
{
Drawing *drawing = [self.stack pop];
[self.undoManager registerUndoWithTarget: self
selector: @selector(pushDrawing:)
object: drawing];
}
Run Code Online (Sandbox Code Playgroud)
如果您使用一张画布,则可能需要重新绘制整个画布,尤其是在弹出绘图时。如果您使用视图或图层,您可能不会...
查看 NSUndoManager 的文档...它可以在 iOS 上使用,并且有很好的示例。它会“记住”您是否撤消或重做,并且会做正确的事情,因此上述内容可以作为一个函数实现(但一开始使用每个方向的一个函数更容易理解)。
| 归档时间: |
|
| 查看次数: |
2196 次 |
| 最近记录: |