Добавление функции отмены в приложение для рисования
Я следовал руководству raywenderlich по использованию UIKit для создания приложения для рисования. Я сейчас пытаюсь добавить в функциональность, чтобы отменить последний удар. В идеале я хотел бы отменить до 10-ти штрихов. Я пытаюсь выяснить, каков наилучший способ сделать это. Я думал о создании другого ImageView, который имеет только последний штрих и делает ImageView.image = nil
когда пользователь нажимает назад. В коде из учебника есть нечто похожее на это. Когда касания заканчиваются, самый новый штрих объединяется с изображением со всеми старыми с правильной непрозрачностью. Я не совсем уверен, как я мог бы добавить это третье (и, возможно, больше) imageivews к этому коду, чтобы он работал. Любые идеи / лучший способ пойти по этому поводу? Код для штрихов закруглен ниже.
Код
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
if !swiped {
// draw a single point
drawLineFrom(lastPoint, toPoint: lastPoint)
}
// Merge tempImageView into mainImageView
UIGraphicsBeginImageContext(mainImageView.frame.size)
mainImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: opacity)
mainImageView.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
tempImageView.image = nil
}
2 ответа
@SpaceShroomies: я нашел / придумал отличное решение..
Я использовал детали из nsHiptser и из учебника Raywenderlich.
И вот мое решение:
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
//undoManager
let undo: UIImageView = undoManager?.prepareWithInvocationTarget(Temp2Image) as! UIImageView
UIGraphicsBeginImageContext(Temp2Image.frame.size)
Temp2Image.image?.drawInRect(CGRect(x: 0, y: 0, width: Temp2Image.frame.size.width, height: Temp2Image.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
TempImage.image?.drawInRect(CGRect(x: 0, y: 0, width: TempImage.frame.size.width, height: TempImage.frame.size.height), blendMode: kCGBlendModeNormal, alpha: opacity)
undo.image = Temp2Image.image
Temp2Image.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
TempImage.image = nil
}
Здесь важно установить, что UNDO должно вернуться к Ie undo.image = Temp2Image.image
иначе это не изменит "это" назад
Таким образом, мне удалось заставить функцию отмены работать на один шаг назад, имея UIImageView, в котором хранится последний штрих перед его добавлением к остальным штрихам, когда следующий штрих завершен... Будет ли что-то не так с использованием той же техники вернуться назад на 10 шагов? Мне нужно 10 UIImageViews... Это будет неэффективно / причиной сбоя? Код ниже:
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
if !swiped {
// draw a single point
drawLineFrom(lastPoint, toPoint: lastPoint)
}
UIGraphicsBeginImageContext(mainImageView.frame.size)
mainImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
undo1.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
mainImageView.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
undo1.image = nil
UIGraphicsBeginImageContext(undo1.frame.size)
undo1.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: opacity)
undo1.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
tempImageView.image = nil
}