2017-04-02 1 views
1

Ich versuche, zwei überlappende UIBezierPaths mit UIBezierPath.append zusammenführen, und ich möchte den überlappenden Raum gefüllt werden. Ich habe versucht, die Eigenschaft usesEvenOddFillRule auf false zu setzen, aber es füllt immer noch nicht. Hier ist minimal Beispiel für das Problem:UIBezierPath Anhängen Überlappung ist nicht gefüllt

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

Daraus ergibt sich die folgende Form:

Shape

Was ich möchte aussehen:

Wanted shape

Dieses Problem scheint auch zu vorkommen, wenn move(to: CGPoint) auf einem UIBezierPath verwendet wird. Wenn Sie beide Formen auf demselben UIBezierPath zeichnen würden, würde das gleiche Problem auftreten.

Weiß jemand, wie man den überlappenden Bereich füllt? Vorzugsweise würde die Lösung auch funktionieren, wenn füllen tun rufen addClip()

Antwort

4

Sie auf dem richtigen Weg waren mit den usesEvenOddFillRule auf false setzen. Außerdem müssen Sie sicherstellen, dass Ihre Formen beide in die gleiche Richtung gezeichnet sind (im oder gegen den Uhrzeigersinn).

Ich habe die Reihenfolge Ihrer addLine s umgekehrt, wenn Sie das Dreieck zeichnen, um es umzukehren.

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

Kurz bevor Sie die erste Form schließen:

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

Ich brauche die fusionierte Pfade später im Code als Clip zu verwenden, so dass dies leider ist keine Lösung für das Problem – Loovjo