Swift UIView: ¿hacer un path siempre al final del dedo de la persona?

Bien, soy nuevo en UIBezierPaths, pero necesito tener una ruta cuyo punto final se actualice según el dedo del usuario. Debería cambiar en touchesMoved

Hasta ahora tengo:

 func customInit() { print("init scene") self.backgroundColor = UIColor.cyan path.move(to: CGPoint(x: 0, y: 0)) path.addLine(to: CGPoint(x: 300, y: 300)) let shapeLayer = CAShapeLayer() shapeLayer.path = path.cgPath shapeLayer.strokeColor = UIColor.blue.cgColor shapeLayer.lineWidth = 3.0 self.layer.addSublayer(shapeLayer) } override public func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { var touch : UITouch! = touches.first! as UITouch var location = touch.location(in: self) path.move(to: location) } 

Pensé que esto actualizaría el punto extremo de la ruta, pero no pasa nada más allá de dibujar la línea original. No quisiera usar SKScene para esto, pero no sé qué va mal.

¿Cómo puedo hacer que una línea siempre tenga un punto en el punto de toque del usuario?

¡Estás muy cerca! Le faltan algunas cosas.

Cuando se llama a touchesMoved , debe actualizar la ruta y volver a asignarla a CAShapeLayer para que se pueda volver a dibujar. En este momento solo está haciendo una modificación al object de la ruta, pero no lo vuelve a dibujar.

Codigo final

 class DrawingView: UIView { let startingPoint = CGPoint(x: 0, y: 0) let shapeLayer = CAShapeLayer() let path = UIBezierPath() override init(frame: CGRect) { super.init(frame: frame) customInit() } requinetworking init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) customInit() } func customInit() { backgroundColor = UIColor.cyan path.move(to: startingPoint) path.addLine(to: CGPoint(x: 50, y: 50)) shapeLayer.path = path.cgPath shapeLayer.strokeColor = UIColor.blue.cgColor shapeLayer.lineWidth = 3.0 layer.addSublayer(shapeLayer) } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesMoved(touches, with: event) let touch = touches.first as! UITouch let location = touch.location(in: self) path.removeAllPoints() path.move(to: startingPoint) path.addLine(to: location) shapeLayer.path = path.cgPath } } 

Resultado final

GIF del punto final de línea en movimiento al tacto

(probado en un parque infantil Xcode 8.3.2)


Actualizar:

Para hacer que la línea desaparezca cuando se suelta el tacto, use touchesEnded . Dentro de este método, simplemente elimine los puntos en la ruta y reasigne a shapeLayer para que la vista se actualice.

 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesEnded(touches, with: event) path.removeAllPoints() shapeLayer.path = path.cgPath }