2014-10-30 104 views
20

第一次使用BezierPaths,想知道这个函数实际上应该如何实现。目前贝塞尔路径在图像的框架内移动,而不是在屏幕上绘图。用UIBezierPath绘制一条线

有没有更好的方法来做到这一点?

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() 
} 
+0

其他的,更直接的方法,而不是使用图像这样的,被使用'CAShapeLayer '或定制'drawRect',如下所述:http://stackoverflow.com/a/16846770/1271826 – Rob 2014-10-30 20:18:25

回答

38

最后只是这样:威廉猎鹰的答案

func drawLineFromPoint(start : CGPoint, toPoint end:CGPoint, ofColor lineColor: UIColor, inView view:UIView) { 

    //design the path 
    var path = UIBezierPath() 
    path.moveToPoint(start) 
    path.addLineToPoint(end) 

    //design path in layer 
    var shapeLayer = CAShapeLayer() 
    shapeLayer.path = path.CGPath 
    shapeLayer.strokeColor = lineColor.CGColor 
    shapeLayer.lineWidth = 1.0 

    view.layer.addSublayer(shapeLayer) 
} 
+1

我没有使用图层中的设计路径。但只是'path.Stroke'。我不明白为什么这条线没有被添加。有什么建议? @williamFalcon – 2016-01-13 10:14:41

2

雨燕3.1版本+改进

这只是一个更新已接受的答案的版本,我只是增加了一点点它。

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) 

} 

当然的实施将

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

我从接受的答案改变什么

我改让增值经销商,并使其更容易输入起点和终点的x和y。我也允许用户改变线条的宽度。

我选择的值为Int类型,但您可以将其更改为其他允许的选项。

0

要绘制在顶部水平线:

let path = UIBezierPath() 
path.moveToPoint(CGPoint(x: 0, y: 0)) 
path.addLineToPoint(CGPoint(x: yourView.frame.width, y: 0)) 

let shapeLayer = CAShapeLayer() 
shapeLayer.path = path.CGPath 
shapeLayer.strokeColor = UIColor.lightGrayColor().CGColor 
shapeLayer.lineWidth = 0.5 

yourView.layer.addSublayer(shapeLayer) 

要绘制水平线上底部:

let path = UIBezierPath() 
path.moveToPoint(CGPoint(x: 0, y: yourView.frame.height)) 
path.addLineToPoint(CGPoint(x: yourView.frame.width, y: yourView.frame.height)) 

let shapeLayer = CAShapeLayer() 
shapeLayer.path = path.CGPath 
shapeLayer.strokeColor = UIColor.lightGrayColor().CGColor 
shapeLayer.lineWidth = 0.5 

yourView.layer.addSublayer(shapeLayer)