UIBezierPath追加重叠未填充 [英] UIBezierPath appending overlapping isn't filled

查看:176
本文介绍了UIBezierPath追加重叠未填充的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to merge two overlapping UIBezierPaths using UIBezierPath.append, and I want the overlapping space to be filled. I tried setting the usesEvenOddFillRule property to false, but it still doesn't fill. Here is minimal example of the problem:

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()
}

这将产生以下形状:

什么我希望它看起来像这样:

What I would like it to look like:

此问题当在一个UIBezierPath上使用 move(to:CGPoint)时,似乎也会发生这种情况。如果将这两个形状都绘制在同一UIBezierPath上,则会发生相同的问题。

This problem also seems to occur when using move(to: CGPoint) on one UIBezierPath. If you would draw both these shapes on the same UIBezierPath, the same problem would occur.

有人知道如何填充重叠区域吗?最好在执行 addClip()

Does anyone know how to make the overlapping region filled? Preferably the solution would also work when doing addClip()

推荐答案

usesEvenOddFillRule 设置为false是正确的。除此之外,您还需要确保形状都沿相同的方向(顺时针或逆时针)绘制。

You were on the right track with setting the usesEvenOddFillRule to false. In addition to that, you need to make sure your shapes are both drawn in the same direction (clockwise or counter-clockwise).

我颠倒了 addLine 绘制三角形以将其反转。

I reversed the order of your addLines when drawing the triangle to reverse it.

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()
}

这篇关于UIBezierPath追加重叠未填充的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆