UIBezierPath附加重叠未填充

时间:2017-04-02 13:09:14

标签: swift uiview append uibezierpath

我正在尝试使用UIBezierPath.append合并两个重叠的UIBezierPaths,我希望填充重叠空间。我尝试将usesEvenOddFillRule属性设置为false,但仍然无法填充。这是问题的最小例子:

override func draw(_ rect: CGRect) {
    let firstShape = UIBezierPath()

    firstShape.move(to: CGPoint(x: 100, y: 100))
    firstShape.addLine(to: CGPoint(x: 100, y: 150))
    firstShape.addLine(to: CGPoint(x: 150, y: 170))
    firstShape.close()

    let secondShape = UIBezierPath(rect: CGRect(x: 125, y: 125, width: 75, height: 75))

    let combined = UIBezierPath()
    combined.append(firstShape)
    combined.append(secondShape)

    UIColor.black.setFill()
    combined.fill()
}

这会产生以下形状:

Shape

我希望它看起来像:

Wanted shape

在一个UIBezierPath上使用move(to: CGPoint)时似乎也会出现此问题。如果要在同一个UIBezierPath上绘制这两个形状,则会出现同样的问题。

有谁知道如何填充重叠区域?优选地,解决方案在执行addClip()

时也可以工作

2 个答案:

答案 0 :(得分:7)

您将usesEvenOddFillRule设置为false,从而走在正确的轨道上。除此之外,您还需要确保您的形状都以相同的方向绘制(顺时针或逆时针)。

在绘制三角形以反转它时,我颠倒了addLine的顺序。

override func draw(_ rect: CGRect) {
    let firstShape = UIBezierPath()

    firstShape.move(to: CGPoint(x: 100, y: 100))
    firstShape.addLine(to: CGPoint(x: 150, y: 170))
    firstShape.addLine(to: CGPoint(x: 100, y: 150))
    firstShape.close()

    let secondShape = UIBezierPath(rect: CGRect(x: 125, y: 125, width: 75, height: 75))

    let combined = UIBezierPath()
    combined.append(firstShape)
    combined.append(secondShape)
    combined.usesEvenOddFillRule = false

    UIColor.black.setFill()
    combined.fill()
}

答案 1 :(得分:0)

在关闭第一个形状之前调用fill:

Query.Aux