Сенсорное рисование не работает, когда UIPanGestureRecognizer реализован для просмотра - PullRequest
1 голос
/ 10 апреля 2019

У меня есть экран для проверки сенсорного экрана устройства с появлением пузырьков. И некоторые imageView добавлены в подпредставления пузырьков, сделанных для них. Затем пользователь проведет пальцем по пузырькам, чтобы проверить сенсорный экран.

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

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

view.addGestureRecognizer(gestureRecognizer)

Тогда возникает задержка, и рисование не работает.

Я хочу обе вещи, такие как лопать пузыри и рисовать на виду. Основная проблема этого жеста состоит в том, что когда я добавляю это в представление, тогда рисование работает без задержки, но всплывающие пузырьки не работают.

    let gestureRecognizer : UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panGestureRecognized(_:)))

            gestureRecognizer.maximumNumberOfTouches = 1
            gestureRecognizer.minimumNumberOfTouches = 1


            view.addGestureRecognizer(gestureRecognizer)

Класс чертежного вида

    import UIKit

    class DrawingView: UIView {

        var drawColor = UIColor.black
        var lineWidth: CGFloat = 5

        private var lastPoint: CGPoint!
        private var bezierPath: UIBezierPath!
        private var pointCounter: Int = 0
        private let pointLimit: Int = 128
        private var preRenderImage: UIImage!

        // MARK: - Initialization

        override init(frame: CGRect) {
            super.init(frame: frame)

            initBezierPath()
        }

        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)

            initBezierPath()
        }

        func initBezierPath() {
            bezierPath = UIBezierPath()
            bezierPath.lineCapStyle = CGLineCap.round
            bezierPath.lineJoinStyle = CGLineJoin.round
        }

        // MARK: - Touch handling

        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            let touch: AnyObject? = touches.first
            lastPoint = touch!.location(in: self)
            pointCounter = 0
        }

        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
            let touch: AnyObject? = touches.first
            let newPoint = touch!.location(in: self)

            bezierPath.move(to: lastPoint)
            bezierPath.addLine(to: newPoint)
            lastPoint = newPoint

            pointCounter += 1

            if pointCounter == pointLimit {
                pointCounter = 0
                renderToImage()
                setNeedsDisplay()
                bezierPath.removeAllPoints()
            }
            else {
                setNeedsDisplay()
            }
        }

        override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
            pointCounter = 0
            renderToImage()
            setNeedsDisplay()
            bezierPath.removeAllPoints()
        }

        override func touchesCancelled(_ touches: Set<UITouch>?, with event: UIEvent?) {
            touchesEnded(touches!, with: event)
        }

        // MARK: - Pre render

        func renderToImage() {

            UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0.0)
            if preRenderImage != nil {
                preRenderImage.draw(in: self.bounds)
            }

            bezierPath.lineWidth = lineWidth
            drawColor.setFill()
            drawColor.setStroke()
            bezierPath.stroke()

            preRenderImage = UIGraphicsGetImageFromCurrentImageContext()

            UIGraphicsEndImageContext()
        }

        // MARK: - Render

        override func draw(_ rect: CGRect) {
            super.draw(rect)

            if preRenderImage != nil {
                preRenderImage.draw(in: self.bounds)
            }

            bezierPath.lineWidth = lineWidth
            drawColor.setFill()
            drawColor.setStroke()
            bezierPath.stroke()
        }

        // MARK: - Clearing

        func clear() {
            preRenderImage = nil
            bezierPath.removeAllPoints()
            setNeedsDisplay()
        }

        // MARK: - Other

        func hasLines() -> Bool {
            return preRenderImage != nil || !bezierPath.isEmpty
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...