为视图实现UIPanGestureRecognizer时触摸绘图不起作用

时间:2019-04-10 07:24:14

标签: ios swift view uipangesturerecognizer

我有屏幕用来测试设备触摸屏的气泡。并为它们添加了一些由十字组成的气泡子视图中的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
        }

    }

0 个答案:

没有答案