web-dev-qa-db-fra.com

Comment tracer une ligne dans Swift 3

Je voudrais que l'utilisateur touche 2 points, puis une ligne est tracée entre ces deux points. Voici ce que j'ai jusqu'à présent:

func drawline(){
    let context = UIGraphicsGetCurrentContext()
    context!.beginPath()
    context?.move(to: pointA)
    context?.addLine(to: pointB)
    context!.strokePath()
}

pointA est le premier point touché par l'utilisateur et pointB est le deuxième point. Je reçois l'erreur: 

thread 1:EXC_BREAKPOINT

Merci d'avance pour votre aide.

13
Charles B.

Pour tracer une ligne entre deux points, la première chose dont vous avez besoin est d’obtenir la CGPoints à partir de la UIView courante, il existe plusieurs façons d’y parvenir. Je vais utiliser une UITapGestureRecognizer afin de détecter un échantillon lorsque vous faites un tapotement.

Une autre étape consiste à tracer la ligne de démarcation entre les deux points lorsque vous enregistrez les deux points. Pour cela, vous pouvez utiliser le contexte graphique de la même manière que vous avez essayé auparavant ou utiliser CAShapeLayer.

Donc, en traduisant les explications ci-dessus, nous obtenons le code suivant:

class ViewController: UIViewController {

   var tapGestureRecognizer: UITapGestureRecognizer!

   var firstPoint: CGPoint?
   var secondPoint: CGPoint?

   override func viewDidLoad() {
       super.viewDidLoad()

       tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.showMoreActions(touch:)))
       tapGestureRecognizer.numberOfTapsRequired = 1
       view.addGestureRecognizer(tapGestureRecognizer)
   }

   func showMoreActions(touch: UITapGestureRecognizer) {
       let touchPoint = touch.location(in: self.view)

       guard let _ = firstPoint else {
           firstPoint = touchPoint
           return
       }

       guard let _  = secondPoint else {
           secondPoint = touchPoint
           addLine(fromPoint: firstPoint!, toPoint: secondPoint!)

           firstPoint = nil
           secondPoint = nil

           return
       }
   }

   func addLine(fromPoint start: CGPoint, toPoint end:CGPoint) {
       let line = CAShapeLayer()
       let linePath = UIBezierPath()
       linePath.move(to: start)
       linePath.addLine(to: end)
       line.path = linePath.cgPath
       line.strokeColor = UIColor.red.cgColor
       line.lineWidth = 1
       line.lineJoin = kCALineJoinRound
       self.view.layer.addSublayer(line)
   }
}

Le code ci-dessus va tracer une ligne à chaque fois que deux points sont sélectionnés et vous pouvez personnaliser la fonction ci-dessus à votre guise. 

J'espère que cela vous aidera.

25
Victor Sigler

Tracez une ligne dans Swift 4.1

class MyViewController: UIViewController {

    @IBOutlet weak var imgViewDraw: UIImageView!

    var lastPoint = CGPoint.zero
    var red: CGFloat = 0.0
    var green: CGFloat = 0.0
    var blue: CGFloat = 0.0
    var brushWidth: CGFloat = 10.0
    var opacity: CGFloat = 1.0
    var isSwiping:Bool!


    override func viewDidLoad() {
        super.viewDidLoad()


    }

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


    //MARK: Touch events
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        isSwiping    = false
        if let touch = touches.first{
            lastPoint = touch.location(in: imgViewDraw)
        }
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

        isSwiping = true;
        if let touch = touches.first{
            let currentPoint = touch.location(in: imgViewDraw)
            UIGraphicsBeginImageContext(self.imgViewDraw.frame.size)
            self.imgViewDraw.image?.draw(in: CGRect(x:0, y:0,width:self.imgViewDraw.frame.size.width, height:self.imgViewDraw.frame.size.height))

            UIGraphicsGetCurrentContext()?.move(to: CGPoint(x: lastPoint.x, y: lastPoint.y))
            UIGraphicsGetCurrentContext()?.addLine(to: CGPoint(x: currentPoint.x, y: currentPoint.y))

            UIGraphicsGetCurrentContext()?.setLineCap(CGLineCap.round)
            UIGraphicsGetCurrentContext()?.setLineWidth(self.brushWidth)
            UIGraphicsGetCurrentContext()?.setStrokeColor(red: red, green: green, blue: blue, alpha: 1.0)
            UIGraphicsGetCurrentContext()?.strokePath()


            self.imgViewDraw.image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            lastPoint = currentPoint
        }
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if(!isSwiping) {
            // This is a single touch, draw a point
            UIGraphicsBeginImageContext(self.imgViewDraw.frame.size)
            self.imgViewDraw.image?.draw(in: CGRect(x:0, y:0,width:self.imgViewDraw.frame.size.width, height:self.imgViewDraw.frame.size.height))
            UIGraphicsGetCurrentContext()?.setLineCap(CGLineCap.round)
            UIGraphicsGetCurrentContext()?.setLineWidth(self.brushWidth)

            UIGraphicsGetCurrentContext()?.move(to: CGPoint(x: lastPoint.x, y: lastPoint.y))
            UIGraphicsGetCurrentContext()?.addLine(to: CGPoint(x: lastPoint.x, y: lastPoint.y))
            UIGraphicsGetCurrentContext()?.setStrokeColor(red: red, green: green, blue: blue, alpha: 1.0)
            UIGraphicsGetCurrentContext()?.strokePath()
            self.imgViewDraw.image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
        }
    }


}
1
Mahesh Chaudhari