Was ist der Unterschied zwischen dem Schließen des Bezier-Pfades mit der closePath-Funktion und dem manuellen Schließen?

8

Ich versuche ein Rechteck mit UIBezierPath zu erstellen. Ich habe zwei verschiedene Wege gewählt, um es zu zeichnen. Außerdem habe ich die Strichbreite auf 25 px erhöht.

Erste Methode: Verwenden von closePath

%Vor%

Ausgabe:

Zweite Methode: Den Pfad manuell schließen

%Vor%

Ausgabe:

In der Dokumentation für closePath heißt es This method closes the current subpath by creating a line segment between the first and last points in the subpath. This method subsequently updates the current point to the end of the newly created line segment, which is also the first point in the now closed subpath.

Und bei der zweiten Methode erstelle ich das Liniensegment zwischen ersten und letzten Punkten. Also, warum in der zweiten Methode Rechteck nicht vollständig gestrichen ist?

Hinweis: Der Unterschied zwischen diesen Methoden ist nur sichtbar, wenn die Strichstärke deutlich erhöht wird.

    
blancos 12.09.2014, 11:14
quelle

2 Antworten

6

Der Unterschied besteht darin, dass die Methode [closePath] dem zugrunde liegenden CGPath, der den UIBezierPath unterstützt, ein zusätzliches Pfadelement hinzufügt.

Wenn Sie [closePath] verwenden, wird ein zusätzliches CGPathElement mit dem Typ kCGPathElementCloseSubpath an das Ende des Pfads unmittelbar nach dem letzten Liniensegment angehängt.

Dies ist besonders wichtig, wenn Sie die Methode [containsPoint:] von UIBezierPath aus der Dokumentation verwenden:

  

Ein Punkt wird nicht als von dem Pfad eingeschlossen betrachtet, wenn er innen liegt   ein offener Unterpfad, unabhängig davon, ob dieser Bereich gemalt wird   während einer Fülloperation. Daher, Maustreffer auf offen zu bestimmen   Pfade müssen Sie eine Kopie des Pfadobjekts erstellen und explizit schließen   Alle Unterpfade (mit der closePath-Methode) vor dem Aufruf dieser Methode.

    
adam.wulf 13.09.2014, 03:47
quelle
0

Ich habe Ihr Beispiel versucht und zwar sowohl mit UIBezierPath als auch mit einfachem Zeichnen auf Kontext mit CGContextAddLineToPoint .

Ihre Frage kann nicht beantwortet werden, aber es scheint, dass

hinzugefügt wurde

bpath.lineCapStyle = kCGLineCapSquare;

löst genau dieses Problem. (oder die CGcontext ... Alternative).

Wahrscheinlich berücksichtigt closePath die lineWidth- und andere Linienparameter, um ein richtig geschlossenes Polygon zu bilden, und passt den Pfad selbst an, um gut geschlossen zu werden. Dies wird wahrscheinlicher, wenn du deine obere rechte Ecke löschst (um es zu einem Dreieck zu machen) und bemerkst, dass der linecapstyle nicht mehr funktioniert, nur das closePath gibt dir ein schönes Dreieck.

    
Templar 12.09.2014 14:09
quelle

Tags und Links