Eliminar la latencia retrasada al dibujar líneas suaves de UIBezierPath en Swift

El siguiente código dibuja líneas curvas suaves al anular los toques, pero hay un retraso o latencia notable. El código usaaddCurveToPoint y llamasetNeedsDisplay después de cada 4 puntos de contacto, lo que provoca una apariencia nerviosa ya que el dibujo no sigue el ritmo de los movimientos de los dedos. Para eliminar el retraso o la latencia percibida, los puntos de contacto 1, 2, 3 (que conducen al punto de contacto 4) podrían llenarse temporalmente conaddQuadCurveToPoint yaddLineToPoint.

¿Cómo se puede lograr esto en el código para eliminar el retraso percibido mediante el uso de una línea temporal y una línea cuadrada antes de mostrar una línea curva final?

Si la siguiente clase está unida a unaUIView (por ejemplo, viewOne oself), ¿cómo hago una copia del dibujo a otro?UIView fuera de la clase (por ejemplo, viewTwo) despuéstouchesEnded?

 //  ViewController.swift

import UIKit

class drawSmoothCurvedLinesWithLagging: UIView {

    let path=UIBezierPath()
    var incrementalImage:UIImage?

    var points = [CGPoint?](count: 5, repeatedValue: nil)

    var counter:Int?

    var strokeColor:UIColor?

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

    override func drawRect(rect: CGRect) {
        autoreleasepool {
            incrementalImage?.drawInRect(rect)
            strokeColor = UIColor.blueColor()
            strokeColor?.setStroke()
            path.lineWidth = 20
            path.lineCapStyle = CGLineCap.Round
            path.stroke()
        }
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        counter = 0

        let touch: AnyObject? = touches.first
        points[0] = touch!.locationInView(self)
    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let touch: AnyObject? = touches.first
        let point = touch!.locationInView(self)

        counter = counter! + 1
        points[counter!] = point


        if counter == 2{
            //use path.addLineToPoint ?
            //use self.setNeedsDisplay() ?
        }

        if counter == 3{
            //use path.addQuadCurveToPoint ?
            //use self.setNeedsDisplay() ?
        }

        if counter == 4{
            points[3]! = CGPointMake((points[2]!.x + points[4]!.x)/2.0, (points[2]!.y + points[4]!.y)/2.0)
            path.moveToPoint(points[0]!)
            path.addCurveToPoint(points[3]!, controlPoint1: points[1]!, controlPoint2: points[2]!)

            self.setNeedsDisplay()

            points[0]! = points[3]!
            points[1]! = points[4]!
            counter = 1
        }
    }

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.drawBitmap()
        self.setNeedsDisplay()
        path.removeAllPoints()
        counter = 0
    }

    override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
        self.touchesEnded(touches!, withEvent: event)
    }

    func drawBitmap(){
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, true, 0.0)
        strokeColor?.setStroke()
        if((incrementalImage) == nil){
            let rectPath:UIBezierPath = UIBezierPath(rect: self.bounds)
            UIColor.whiteColor().setFill()
            rectPath.fill()
        }

        incrementalImage?.drawAtPoint(CGPointZero)
        path.stroke()
        incrementalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    }

}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

Respuestas a la pregunta(1)

Su respuesta a la pregunta