我想要完成this demo does而不是iOS。从本质上讲,描绘一条路径并在它被抚摸时填充它,没有关闭线。
我现在的方法是CGPath
,将setNeedsDisplay
变量移到上一个点并将一条线划到当前点。然后,拨打override func drawRect(rect: CGRect) {
guard let strokePath = self.strokePath else {
return
}
if let firstPoint = self.points.value.first {
let context = UIGraphicsGetCurrentContext()
// 1.
CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor)
CGContextSetFillColorWithColor(context, self.fillColor.CGColor)
CGContextSetLineCap(context, .Round)
CGContextSetLineWidth(context, self.lineWidth)
// 2.
let path = UIBezierPath(CGPath: strokePath)
// 3.
path.addLineToPoint(firstPoint)
// 4.
CGContextAddPath(context, path.CGPath)
CGContextDrawPath(context, .EOFill)
CGContextAddPath(context, strokePath)
CGContextDrawPath(context, .Stroke)
}
}
,其中我执行:
let path = UIBezierPath()
path.moveToPoint(firstPoint)
for point in self.points.value {
path.addLineToPoint(point)
}
path.addLineToPoint(firstPoint)
笔划路径按我想要的方式划线,但复制的路径仅从原始路径中的最后一个点填充到我添加线的第一个点。我想要的是填充整个事物,包括复制路径中的所有点。如果我手动构建新路径(用户绘制的时间变得非常低效),如下所示:
UIBezierPath
路径填充正确,如下所示:
这正是我想要达到的效果。但是我无法弄清楚为什么复制路径然后添加最终点只会触发新添加的内容,而不是整个路径。我用CGPathCreateMutableCopy
和使用{{1}}尝试了它,但没有运气。
答案 0 :(得分:0)
除非我遗漏某些东西,否则你似乎已经把它变得比它应该更复杂了。
此类允许我以与链接视频匹配的方式绘制视图,并允许绘制与您的示例匹配的图形。
class SDDFilledSketchView: UIView {
var panRecognizer: UIPanGestureRecognizer? = nil
var tracePath: UIBezierPath? = nil
override func awakeFromNib() {
panRecognizer = UIPanGestureRecognizer.init(target: self, action:"handlePan:")
if (panRecognizer != nil) {
self.addGestureRecognizer(panRecognizer!)
}
}
func handlePan(recognizer: UIPanGestureRecognizer) {
let touchPoint = recognizer.locationInView(self)
if recognizer.state == .Began {
tracePath = UIBezierPath.init()
tracePath?.lineWidth = 5
tracePath?.lineCapStyle = .Round
tracePath?.moveToPoint(touchPoint)
} else {
tracePath?.addLineToPoint(touchPoint)
}
recognizer.setTranslation(CGPointZero, inView: self)
self.setNeedsDisplay()
}
override func drawRect(rect: CGRect) {
// Drawing code
let context = UIGraphicsGetCurrentContext()
CGContextSetFillColorWithColor(context, UIColor.cyanColor().CGColor)
CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor)
if tracePath != nil {
tracePath?.fill()
tracePath?.stroke()
}
}
}
这是将用户的路径存储在UIBezierPath中而不必重新创建它,只需在用户移动手指时向路径添加一条线,让drawRect执行填充和描边。