Я пишу графическое программное обеспечение для iPhone (http://www.layersforiphone.com/), и я потратил некоторое время, пытаясь выяснить это. Проблема в том, что CGContexts по своей сути не «отменяемы». Вы не можете заполнить прямоугольник или восстановить часть, которую вы перерисовали. Данные просто отсутствуют. По моему опыту, лучше всего создать метод «сохранения», который просматривает изменяемую область и сохраняет данные изображения в этой области в стек отмены. перед выполнением операций рисования. Затем, когда вы решите отменить, вы можете взять измененную область и восстановить ее из сохраненных данных.
Я решил реализовать этот подход независимо от NSUndoManager в слоях, потому что вам в основном нужен стек CGImageRefs и CGRects, и он плохо отображается в NSUndoManager.
Примечание. Технически вы можете просто сохранять копию всего изображения при каждом его изменении. Это плохое использование памяти, поскольку вы можете изменить только небольшую область. Если вы хотите иметь щедрую историю отмен (более 10 шагов), то определенно стоит потратить время на сохранение и восстановление небольших изображений в пределах области рисования.
Надеюсь, это поможет! Я знаю, что это не очень хорошее решение - вы действительно мало что можете сделать со встроенными API. Если вы создадите общее решение этой проблемы, я думаю, что многие заинтересуются этим!