2012-03-29 12 views
5

Sto lavorando a un'app e devo tracciare una linea morbida, quindi ho seguito questo collegamento per smussare la riga iPhone smooth sketch drawing algorithm e ho seguito la risposta di kyoji. Ma ora non so come implementare la funzionalità Annulla Ripristina.Come annullare e ripristinare una linea smussata in iPhone?

Please help

+0

hai provato a utilizzare la classe integrata NSUndoManager – MCKapur

+0

questa opzione è disponibile in Mac OS X v10.0 e versioni successive non in iOS. e la mia app è in iOS – Mashhadi

+2

e iOS 3.0 e versioni successive: https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUndoManager_Class/Reference/Reference.html –

risposta

0

Utilizzare NSUndoManager. Tuttavia, se stai dipingendo delle linee sulla tela, dovrai anche mantenerne la rappresentazione (in modo da poterle escludere).

Quindi, se li si raccoglie come UIBezierPath, o si utilizzano i livelli di forma, o il proprio "array di punti" si annulla nello stesso modo.

Quindi, mentre si disegna la linea, mantenere una registrazione dei punti utilizzati nel disegno. Quando il disegno è terminato (ad es. TouchesEnded), vuoi "spingere" il disegno e dire al gestore di annullamento come annullarlo. Semplicemente, sarebbe qualcosa come questo quasi-code ...

- (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]; 
} 

Se si utilizza uno tela, potrebbe essere necessario ridisegnare l'intera cosa, soprattutto quando schioccare una svinatura. Se si utilizza una vista o strati, non si può ...

Guardate la documentazione per NSUndoManager ... è disponibile su iOS, e ha buoni esempi. Si "ricorda" se annulli o ripristini e farai la cosa giusta, quindi quanto sopra potrebbe essere implementato come una funzione (ma è più facile capire all'inizio con una funzione che va in ogni direzione).

+0

Ciao @JodyHagins, sto anche affrontando il problema di annullare e ripristinare, sto disegnando su CGLayers, per l'ottimizzazione. Ho provato un po 'di codice, ma non so, dove sto sbagliando, puoi per favore guardare il codice, sotto c'è il link http://stackoverflow.com/questions/11394839/undo-redo-issues-with-cglayer. Aspettando la tua risposta, grazie – Ranjit