2017-04-02 87 views
1

我試圖合併兩個重疊的UIBezierPaths使用UIBezierPath.append,我想重疊的空間被填充。我嘗試將usesEvenOddFillRule屬性設置爲false,但它仍未填充。這是問題的小例子:UIBezierPath追加重疊未填充

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

回答

4

你在正確的軌道上與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() 
} 
0

時的解決辦法也工作得叫填寫您關閉第一個形狀之前:

firstShape.fill() 
firstShape.close() 
+0

我需要稍後在代碼中使用合併路徑作爲剪輯,所以這不幸並不是解決問題的方法 – Loovjo