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!
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
@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 .. –
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