Как отменить это изменение с помощью Undo Manager? - PullRequest
0 голосов
/ 25 апреля 2019

Моя цель - стереть UIImage штрихами, а затем отменить изменения. У меня 2 UIImage настроено:

Temp Image - изображение, отображаемое при стирании.

Главное изображение - сначала скрывается. Когда вы поднимаете палец, основное изображение устанавливается на Temp, чтобы вы могли видеть сделанные вами изменения. Основное изображение будет использоваться для дальнейших целей.

Стирание работает нормально, но при нажатии отмены ничего не происходит. При двойном нажатии он иногда удаляет строку. Любые нажатия после этого, похоже, ничего не делают. Как настроить UndoManager для удаления этих штрихов?

Вот github , если это поможет.

var startingPoint: CGPoint!
var touchPoint: CGPoint!
var currentPhoto: UIImage?

...

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    mainImageView.isHidden = true
    tempImageView.isHidden = false
    let touch = touches.first
    startingPoint = touch?.location(in: self.tempImageView)
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first
    touchPoint = touch?.location(in: self.tempImageView)
    if touchPoint.y <= -0 || touchPoint.y >= (tempImageView.frame.height) {
        return
    }

    UIGraphicsBeginImageContextWithOptions(tempImageView.bounds.size, false, 0)
    tempImageView.image?.draw(in: tempImageView.bounds)

    if let context = UIGraphicsGetCurrentContext() {
        context.setBlendMode(CGBlendMode.clear)
        context.setLineCap(CGLineCap.round)
        context.setLineWidth(15)
        context.beginPath()
        context.setBlendMode(CGBlendMode.clear)
        context.move(to: startingPoint)
        context.addLine(to: touchPoint)
        context.strokePath()

        tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
        currentPhoto = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        startingPoint = touchPoint
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    mainImageView.isHidden = false
    tempImageView.isHidden = true

    setNewImage(newImage: currentPhoto)
}

func setNewImage(newImage: UIImage?) {
    undoManager?.registerUndo(withTarget: self, handler: { (targetSelf) in
        self.mainImageView.image = newImage
    })
    mainImageView.image = newImage
}
...