在 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)