Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Draw a line with UIBezierPath

First time using BezierPaths, wondering how this function is actually supposed to be implemented. Currently the bezier path moves within the frame of the image, as opposed to drawing on screen.

Is there a better way to do it?

func drawLineFromPoint(start : CGPoint, toPoint end:CGPoint, ofColor lineColor: UIColor, inView view:UIView) {      var maxWidth = abs(start.x - end.x)     var maxHeight = abs(start.y - end.y)      var contextSize : CGSize!     if maxWidth == 0 {         contextSize = CGSize(width: 1, height: maxHeight)     }else {         contextSize = CGSize(width: maxWidth, height: 1)     }      //design the path     UIGraphicsBeginImageContextWithOptions(contextSize, false, 0)     var path = UIBezierPath()     path.lineWidth = 1.0     lineColor.set()      //draw the path and make visible     path.moveToPoint(start)     path.addLineToPoint(end)     path.stroke()      //create image from path and add to subview     var image = UIGraphicsGetImageFromCurrentImageContext()     var imageView = UIImageView(image: image)     view.addSubview(imageView)     UIGraphicsEndImageContext() } 
like image 261
William Falcon Avatar asked Oct 30 '14 20:10

William Falcon


People also ask

What is Uibezierpath in Swift?

A path that consists of straight and curved line segments that you can render in your custom views.


2 Answers

Ended up doing it this way:

func drawLineFromPoint(start : CGPoint, toPoint end:CGPoint, ofColor lineColor: UIColor, inView view:UIView) {          //design the path     let path = UIBezierPath()     path.move(to: start)     path.addLine(to: end)          //design path in layer     let shapeLayer = CAShapeLayer()     shapeLayer.path = path.cgPath     shapeLayer.strokeColor = lineColor.CGColor     shapeLayer.lineWidth = 1.0          view.layer.addSublayer(shapeLayer) } 
like image 102
William Falcon Avatar answered Oct 14 '22 09:10

William Falcon


Swift 3.1 Version of William Falcon's Answer + Improved

This is just an updated version of already accepted answer, and I just added a little bit more to it.

func drawLineFromPointToPoint(startX: Int, toEndingX endX: Int, startingY startY: Int, toEndingY endY: Int, ofColor lineColor: UIColor, widthOfLine lineWidth: CGFloat, inView view: UIView) {      let path = UIBezierPath()     path.move(to: CGPoint(x: startX, y: startY))     path.addLine(to: CGPoint(x: endX, y: endY))      let shapeLayer = CAShapeLayer()     shapeLayer.path = path.cgPath     shapeLayer.strokeColor = lineColor.cgColor     shapeLayer.lineWidth = lineWidth      view.layer.addSublayer(shapeLayer)  } 

And of course the implementation would be

drawLineFromPointToPoint(startX: Int, toEndingX: Int, startingY: Int, toEndingY: Int, ofColor: UIColor, widthOfLine: CGFloat, inView: UIView) 

What I changed from accepted answer

I changed the vars to lets, and made it easier to input the start and end of both the x and the y. I also allow the user to change the width of the line.

I chose for the values to be of type Int, but you can change those to be the other allowed options.

like image 40
RubberDucky4444 Avatar answered Oct 14 '22 07:10

RubberDucky4444