在 Swift 3.x 中使用 UIBezierPath 画一条线

Posted

技术标签:

【中文标题】在 Swift 3.x 中使用 UIBezierPath 画一条线【英文标题】:Drawing a line in Swift 3.x with UIBezierPath 【发布时间】:2016-12-15 14:49:31 【问题描述】:

我正在尝试使用 UIBezierpath 在 UIView 上画一条线。我想我错过了一些东西,但无法找到它。

这是我的代码:

// Code for touch recognition
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    swiped = false
    if let touch = touches.first as? UITouch? 
        lastPoint = (touch?.location(in: fullview))!
        //print(lastPoint)
    


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 
    swiped = true
    if let touch = touches.first as? UITouch? 
        let currentPoint = touch?.location(in: fullview)
        drawLineFrom(fromPoint: lastPoint, toPoint: currentPoint!)

        lastPoint = currentPoint!
        //print(lastPoint)
        //print("touch moved")
    


override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 
    if !swiped 
        drawLineFrom(fromPoint: lastPoint, toPoint: lastPoint)
    
    //print("touch ended")


//code for drawing
func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint)

    UIGraphicsBeginImageContext(fullview.frame.size)

    let context = UIGraphicsGetCurrentContext()

    let aPath = UIBezierPath()

    //aPath.move(to: fromPoint)
    //aPath.addLine(to: toPoint)
    aPath.lineWidth=10.0
    aPath.lineJoinStyle = .round
    aPath.move(to: CGPoint(x:15,y:15))
    aPath.addLine(to: CGPoint(x:80,y:80))
    aPath.addClip()
    aPath.close()
    UIColor.green.set()
    aPath.stroke()

    //print("drawline")
    //print("Frompoint = ",fromPoint)
    //print("topoint = ",toPoint)

  /*  context?.setLineCap(.round)
    context?.setLineWidth(brushWidth)
    context?.setStrokeColor(red: red, green: green, blue: blue, alpha: 1.0)
    context?.setBlendMode(.normal)

    context?.beginPath()
    context?.move(to: fromPoint)
    context?.addLine(to: toPoint)
    context?.closePath()
    context?.strokePath()*/


    //let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    fullview.setNeedsDisplay()

如您所见,我也在上下文中尝试了它,但它也不起作用。

【问题讨论】:

Check this Google 是我的朋友 :) 我只是在寻找错误的关键字,谢谢 这实际上是你的确切标题:-) Draw a line with UIBezierPath的可能重复 【参考方案1】:

我用它来画一条线:

    let doYourPath = UIBezierPath(rect: CGRect(x: xPos, y: yPos, width: yourWidth, height: yourHeight))
    let layer = CAShapeLayer()
    layer.path = doYourPath.cgPath
    layer.strokeColor = UIColor.white.cgColor
    layer.fillColor = UIColor.white.cgColor

    self.view.layer.addSublayer(layer)

希望这对您有所帮助。这只是快速画线的一种方式。

【讨论】:

【参考方案2】:

好吧,您正在绘制到图像上下文(屏幕外位图),而不是视图中。这很可能不是你想要的?请确保您已阅读 ios Drawing Concepts。

您的UIView 子类可能应该只跟踪触摸的位置(如在var touchedPositions = [CGPoint]() 中)并调用setNeedsDisplay()。 然后在您的子类中实现func draw(_ rect: CGRect) 方法。在此方法中,创建路径并根据您跟踪的位置绘制它(不创建新上下文)。

【讨论】:

以上是关于在 Swift 3.x 中使用 UIBezierPath 画一条线的主要内容,如果未能解决你的问题,请参考以下文章

使用未解析的标识符“FIRAuth”(Swift 2、Firebase 3.x)

读取引发的 Firebase 身份验证错误(Firebase 3.x 和 Swift)

如何使用 vapor 3.x 构建蒸汽工具箱

有没有办法在我的 ios 应用程序中创建高分辨率图像?

我将如何从接触点获取最低和最高坐标数?

如何将此方法从 Objective-C 转换为 Swift?