На iPhone Core Data встроена поддержка отмены и повтора.Просто сделайте так, чтобы ваша модель данных отражала нарисованные объекты, и вы можете легко перемещать ее назад и вперед между сохранениями.Обычно вы сохраняете процедуры и объекты, используемые для создания графики, вместо самой графики.
Редактировать:
ОК, но это лишь небольшая поддержка API для реализации номера 2 и не поможет с примерами, которые я дал.
Ключевая идея выполнения этой работы заключается в том, что вы не настраиваете свою модель данных для модальной и сохраняющей графический вывод программы, вы настраиваете ее на модальную и сохраняете процесс создания графического вывода.
Наивным способом создания графической программы было бы настроить поток данных следующим образом:
Input_UI-->Display_UI-->Data_Model
Пользователь манипулирует Input_UI, который напрямую изменяет экранную графику Display_UI.Только когда пользователь сохранит, Data_Model вступит в игру.Этот тип потока данных делает отмену / повтор (и другие вещи) очень сложным для реализации, особенно в рисовании, например, в программе композитинга.Каждая операция должна знать, как отменить себя, и должна уметь работать с измененной графикой.
Лучший способ - настроить поток данных следующим образом:
Input_UI-->Data_Model-->Display_UI
Пользователь манипулирует Input_UI, который связывается с Data_Model, который манипулирует выбранным пользователем.Data_Model записывает процесс, например, «добавить файл jpg.1 at rect {0,0,100,100}».Изменение в Data_Model отправляет уведомление в Display_UI, который считывает измененные данные и реализует описанный процесс.
Data_Model откатывается назад, а Display_UI просто рисует то, что сообщает Data_Model.Display_UI вообще не должен понимать процесс отмены.
В программе рисования вы должны создавать логические слои отдельных графических объектов, так что повторное выполнение - это просто удаление слоев в обратном порядке, в котором они были добавлены.Для программ рисования / композиции вы должны начать с последней точки сохранения и воссоздать графику, продолжая до последнего шага -1.
Итак, в ваших примерах для программы компоновки:
- Data_Model хранит координаты выбранной области (всего холста), которая все еще просто "rect {0,0,canvas.width, canvas.height} ", а затем операция" залить черным ".Для отмены Display_UI возвращает изображение к последней точке сохранения, а затем незаметно применяет изменения, сделанные до последнего -1.
- Вам просто нужно сохранить кэш изображения до следующего сохранения.В этот момент Data_Modal фиксирует все изменения и экспортирует композицию в файл.При следующем запуске приложения оно начинается с изображения из последнего раза.Если вы хотите отменить бесконечное, то да, вы должны сохранить импортированное изображение навсегда.
Способ подойти к этому - игнорировать графический интерфейс и вместо этого подумать о том, как создать приложение для запуска из командной строки без ввода или вывода графического интерфейса.Data_Modal будет работать точно так же.Это позволит сохранить текстовые команды и данные (например, импортированные изображения) для создания выходного изображения, а не просто снимок изображения на экране.