Verwenden Sie den NSUndoManager. Wenn Sie jedoch Linien auf der Leinwand malen, müssen Sie auch deren Darstellung beibehalten (so dass Sie sie abschneiden können).
Also, ob Sie sie als UIBezierPath sammeln, oder Form Layers oder Ihre eigenen "Array von Punkten" verwenden, die Sie auf die gleiche Weise rückgängig machen.
Zeichnen Sie also beim Zeichnen der Linie die Punkte auf, die Sie in Ihrer Zeichnung verwendet haben. Wenn die Zeichnung fertig ist (z. B. touchesEnded), möchten Sie Ihre Zeichnung "pushen" und dem Rückgängig-Manager mitteilen, wie Sie die Zeichnung rückgängig machen können. Einfach gesagt, es wäre so etwas wie dieser fast-Code sein ...
- (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];
}
Wenn Sie eine Leinwand verwenden, können Sie die ganze Sache neu zeichnen müssen, vor allem, wenn ein Abziehen knallen. Wenn Sie Ansichten oder Ebenen verwenden, können Sie nicht ...
Schauen Sie sich die Dokumentation für NSUndoManager an ... sie ist unter iOS verfügbar und hat gute Beispiele. Es "erinnert" sich daran, wenn Sie es rückgängig machen oder wiederholen, und Sie werden das Richtige tun, also könnte das Obige als eine Funktion implementiert werden (aber es ist einfacher zuerst mit einer Funktion in jede Richtung zu verstehen).
haben Sie versucht, mit der integrierten Klasse NSUndoManager – MCKapur
dies ist verfügbar in Mac OS X v10.0 und höher nicht in iOS. und meine App ist in iOS – Mashhadi
und iOS 3.0 und höher: https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUndoManager_Class/Reference/Reference.html –