Рисование на увеличенном изображении - PullRequest
0 голосов
/ 05 марта 2019

У меня есть вид прокрутки с изображением. Пользователь может ущипнуть, чтобы увеличить и уменьшить масштаб правильно. Теперь я пытаюсь нарисовать изображение и сталкиваюсь с проблемой: если я увеличу масштаб и попытаюсь нарисовать видимую часть изображения, изображение уменьшится и снова станет полностью видимым.

Эта проблема появляется, только если я начинаю рисовать на увеличенном изображении. Если я сначала нарисую изображение, а затем увеличу масштаб и попытаюсь нарисовать, все выглядит хорошо.

Ниже мой код.

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...