如何在iPhone中撤消和重做流畅的线条?

Mas*_*adi 6 iphone drawing line

我正在研究一个应用程序,我必须绘制一条平滑的线,所以我按照这个链接平滑线平滑的草图绘制算法,我按照答案kyoji.但现在我不知道如何实现撤消重做功能.

请帮忙

Jod*_*ins 0

使用 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 上使用,并且有很好的示例。它会“记住”您是否撤消或重做,并且会做正确的事情,因此上述内容可以作为一个函数实现(但一开始使用每个方向的一个函数更容易理解)。