我正在尝试使用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()
}
这会产生以下形状:
我希望它看起来像:
在一个UIBezierPath上使用move(to: CGPoint)
时似乎也会出现此问题。如果要在同一个UIBezierPath上绘制这两个形状,则会出现同样的问题。
有谁知道如何填充重叠区域?优选地,解决方案在执行addClip()
答案 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