I'm trying to make eraser feature(and restore in future) for my app but facing some problems. I'm using Swift 4.2 and this what I made so far:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first as UITouch?{
let touchPoint = touch.location(in: self.lassoImageView) + lassoOffset!
print("touch begin to : \(touchPoint)")
eraserStartPoint = touchPoint
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first as UITouch?{
let touchPoint = touch.location(in: self.lassoImageView) + lassoOffset!
print("touch moved to : \(touchPoint)")
erase(fromPoint: eraserStartPoint!, toPoint: touchPoint)
eraserStartPoint = touchPoint
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first as UITouch?{
let touchPoint = touch.location(in: self.lassoImageView) + lassoOffset!
print("touch ended at : \(touchPoint)")
erase(fromPoint: touchPoint, toPoint: touchPoint)
UIGraphicsBeginImageContext(lassoImageView.frame.size)
lassoImageView.image?.draw(in: CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height), blendMode: .normal, alpha: 1.0)
lassoImageView.image?.draw(in: CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height), blendMode: .normal, alpha: 1.0)
lassoImageView.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
func erase(fromPoint: CGPoint, toPoint: CGPoint) {
UIGraphicsBeginImageContextWithOptions(lassoImageView.bounds.size, false, 1)
//UIGraphicsBeginImageContext(lassoImageView.bounds.size)
//UIGraphicsBeginImageContext(lassoImageView.image!.size)
let context = UIGraphicsGetCurrentContext()
lassoImageView.image?.draw(in: CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height))
//lassoImageView.image?.draw(in: calculateRectOfImageInImageView(imageView: lassoImageView))
context?.move(to: fromPoint)
context?.addLine(to: toPoint)
context?.setLineCap(.round)
context?.setLineWidth(CGFloat(eraserBrushWidth))
context?.setBlendMode(.clear)
context?.strokePath()
lassoImageView.image = UIGraphicsGetImageFromCurrentImageContext()
croppedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
lassoImageView // this is UIImageView where I'm loading image from gallery and then erasing image with my finger
lassoOffset // this is Float for touch offset because finger hides part of image
Code is simple and it actually works but if image aspect ration is different from UIImageView aspect ratio. UIImageView content mode is set to Aspect Fit
but anyways when I drag my finger image become stretched like if it was Scale to Fill
I believe problem is with my rect in this line:
lassoImageView.image?.draw(in: CGRect(x: 0, y: 0, width: lassoImageView.frame.size.width, height: lassoImageView.frame.size.height))
I even tried to calculate image rect itself but in this case image just disappeared after touches begun
Maybe my question is noob and I probably missing something ridiculous, but I really really need to figure this out.
Thanks to every one and have a great day
Best, Victor