Добавление функции отмены в приложение для рисования

Я следовал руководству 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
    }
Другие вопросы по тегам