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.
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.
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.
Tags und Links ios uibezierpath core-graphics