У меня есть вид прокрутки с изображением. Пользователь может ущипнуть, чтобы увеличить и уменьшить масштаб правильно. Теперь я пытаюсь нарисовать изображение и сталкиваюсь с проблемой: если я увеличу масштаб и попытаюсь нарисовать видимую часть изображения, изображение уменьшится и снова станет полностью видимым.
Эта проблема появляется, только если я начинаю рисовать на увеличенном изображении. Если я сначала нарисую изображение, а затем увеличу масштаб и попытаюсь нарисовать, все выглядит хорошо.
Ниже мой код.
scrollView.panGestureRecognizer.minimumNumberOfTouches = 2
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(didPan(_:)))
scrollView.addGestureRecognizer(panGestureRecognizer)
Тогда селектор
@objc func didPan(_ sender: UIPanGestureRecognizer) {
switch sender.state {
case .began:
lastPoint = sender.location(in: imageView)
case .changed:
let currentPoint = sender.location(in: imageView)
imageView.image = imageView.draw(from: lastPoint, to: currentPoint)
lastPoint = currentPoint
case .ended:
imageView.image = imageView.draw(from: lastPoint, to: lastPoint)
default:
print("Don't care")
}
}
И наконец то, что я использую для рисования
extension UIImageView {
func draw(from: CGPoint, to: CGPoint) -> UIImage? {
if let image = image {
UIGraphicsBeginImageContext(image.size)
let context = UIGraphicsGetCurrentContext()
image.draw(in: CGRect(origin: .zero, size: image.size))
let scaleWidth = image.size.width / bounds.size.width
let scaleHeight = image.size.height / bounds.size.height
let brushWidth: CGFloat = 50
let fromPoint = CGPoint(x: from.x * scaleWidth, y: from.y * scaleHeight)
let toPoint = CGPoint(x: to.x * scaleWidth, y: to.y * scaleHeight)
context?.move(to: fromPoint)
context?.addLine(to: toPoint)
context?.setLineCap(.round)
context?.setLineWidth(scaleWidth * brushWidth)
context?.setFillColor(UIColor.black.cgColor)
context?.setBlendMode(.normal)
context?.strokePath()
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return result
}
return nil
}
}