来自CGPath的CGPathCreateMutableCopy / BezierPath不会填充原始文件

时间:2016-02-03 22:38:47

标签: ios swift core-graphics

我想要完成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)
  1. 我设置了所有路径属性,如线宽,线帽等
  2. 我从原始描边路径
  3. 创建一个bezier路径
  4. 我在第一点添加一行
  5. 我将两个路径添加到上下文中,并绘制它们填充一个并抚摸另一个。
  6. 笔划路径按我想要的方式划线,但复制的路径仅从原始路径中的最后一个点填充到我添加线的第一个点。我想要的是填充整个事物,包括复制路径中的所有点。如果我手动构建新路径(用户绘制的时间变得非常低效),如下所示:

    UIBezierPath

    路径填充正确,如下所示:

    enter image description here

    这正是我想要达到的效果。但是我无法弄清楚为什么复制路径然后添加最终点只会触发新添加的内容,而不是整个路径。我用CGPathCreateMutableCopy和使用{{1}}尝试了它,但没有运气。

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执行填充和描边。