2009-12-15 18 views
4

J'ai une application qui utilise cgcontext pour dessiner des choses sur un UIImageView que l'utilisateur dessine en utilisant des événements tactiles, et je veux être capable d'annuler les dessins faits par l'utilisateur.Comment utiliser NSUndoManager avec un UIImageView ou CGContext

Edit:


Je suis en train d'utiliser mon touchesBegan pour sauver theUIImage au début d'une touche à la NSUndoManager


Et comment puis-je l'utiliser pour annuler en utilisant un UIAlertView. Signification, je veux appeler une méthode de mon UIAlertView que l'annulation est alors une autre qui va refaire, mais je ne sais pas comment accomplir cela.
S'il vous plaît aider

Répondre

3

J'écris un logiciel graphique pour l'iPhone (http://www.layersforiphone.com/) et j'ai passé un moment à essayer de comprendre cela. Le problème est que CGContexts ne sont pas intrinsèquement "annulables". Vous ne pouvez pas remplir un rectangle ou restaurer une partie que vous avez dessinée. Les données ne sont tout simplement pas là. Dans mon expérience, le meilleur pari est de créer une méthode de «sauvegarde» qui regarde la région étant changée et enregistre les données d'image dans cette région à la pile d'annulation avant que des opérations de dessin soient exécutées. Ensuite, lorsque vous décidez d'annuler, vous pouvez prendre la région modifiée et la restaurer à partir de vos données enregistrées.

J'ai choisi d'implémenter cette approche indépendamment de NSUndoManager dans Calques parce que vous avez besoin fondamentalement d'une pile de CGImageRefs et de CGRects et il ne correspond pas bien au NSUndoManager.

Remarque: Techniquement, vous pouvez simplement enregistrer une copie de l'image entière chaque fois qu'elle est modifiée. C'est une mauvaise utilisation de la mémoire, car vous ne pouvez changer qu'une petite zone. Si vous voulez avoir une histoire d'annulation généreuse (plus de 10 étapes), il vaut vraiment la peine d'enregistrer et de restaurer de petites sous-images dans votre espace de dessin.

Espérons que ça aide! Je sais que ce n'est pas une bonne solution - vous ne pouvez vraiment pas faire grand-chose avec les API intégrées. Si vous créez une solution générale à ce problème, je pense que beaucoup de gens seraient intéressés par cela!

+0

Eh bien tout d'abord si vous faites face à ce genre de choses tout le temps, alors pouvez-vous m'aider avec cette question: http://stackoverflow.com/questions/1943325/how-do-i-stroke-a-cgcontext-path -with-multiple-images-aléatoires, et aussi, tout ce que je veux faire est de sauvegarder l'image de ce que je dessine m CGContext à – Jaba

+0

@Ben: j'ai fait l'application de dessin et annuler/refaire la fonctionnalité me rend fou .. comme vous l'avez écrit: "vous pourriez simplement enregistrer une copie de l'image entière chaque fois qu'il est modifié .." Voulez-vous s'il vous plaît dire comment et où stocker ces images ?? Je peux penser à deux options pour enregistrer des images à des fins temporaires: 1) Utilisation du tampon 2) Base de données SqlLite. Je ne sais pas comment enregistrer l'image en utilisant le tampon et je vais essayer la deuxième option .. Si vous pouviez me guider comment enregistrer des fichiers, j'apprécierai votre aide .. –

+0

Salut @Ben: Je travaille avec un projet de dessin, j'ai un problème avec gomme, pouvez-vous s'il vous plaît jeter un oeil à ce lien et me suggérer quelque chose http://stackoverflow.com/questions/11502320/eraser-not-working-in-ios-drawing – Ranjit