Моя цель - стереть 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
}