2014-09-12 7 views
8

Sto provando a creare un rettangolo utilizzando UIBezierPath. Ho adottato due modi diversi per disegnarlo. Inoltre, ho aumentato la larghezza del tratto a 25 px.Qual è la differenza tra la chiusura del percorso di Bezier con la funzione closePath e la chiusura manuale?

Primo metodo: Utilizzo closePath

UIBezierPath *bpath = [UIBezierPath bezierPath]; 

[bpath moveToPoint:CGPointMake(x, y)]; 
[bpath addLineToPoint:CGPointMake(x + w, y)]; 
[bpath addLineToPoint:CGPointMake(x + w, y + h)]; 
[bpath addLineToPoint:CGPointMake(x, y + h)]; 
[bpath closePath]; 

uscita:

Using closePath

Secondo metodo: chiusura del percorso manualmente

UIBezierPath *bpath = [UIBezierPath bezierPath]; 

[bpath moveToPoint:CGPointMake(x, y)]; 
[bpath addLineToPoint:CGPointMake(x + w, y)]; 
[bpath addLineToPoint:CGPointMake(x + w, y + h)]; 
[bpath addLineToPoint:CGPointMake(x, y + h)]; 
[bpath addLineToPoint:CGPointMake(x, y)]; 

uscita:

Closing path manually

Nella documentazione per closePath si dice 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.

E in secondo metodo che sto creando il segmento di linea tra il primo e l'ultimo punto. Quindi, perché nel secondo metodo il rettangolo non è completamente accarezzato?

Nota: la differenza tra questi metodi è visibile solo quando la larghezza della corsa aumenta significativamente.

risposta

6

La differenza è che il metodo [closePath] aggiunge effettivamente un ulteriore elemento di percorso al CGPath sottostante che supporta UIBezierPath.

Se si utilizza [closePath], un ulteriore CGPathElement con un tipo di kCGPathElementCloseSubpath verrà aggiunto alla fine del percorso immediatamente dopo l'ultimo segmento di linea.

Ciò è particolarmente importante quando si utilizza il [containsPoint:] metodo di un UIBezierPath dalla documentazione:

Un punto non è considerato essere racchiuso dal percorso se è all'interno un sottopercorso aperto, indipendentemente se questa area verrebbe verniciata durante un'operazione di riempimento. Pertanto, per determinare i colpi del mouse sui percorsi aperti , è necessario creare una copia dell'oggetto del percorso e chiudere esplicitamente sottotraccia (utilizzando il metodo closePath) prima di chiamare questo metodo.

0

Ho provato il tuo esempio e in effetti questo accade sia con UIBezierPath sia con un semplice disegno sul contesto con CGContextAddLineToPoint.

non può rispondere alla tua domanda, ma sembra che l'aggiunta

bpath.lineCapStyle = kCGLineCapSquare;

risolve questo problema esatto. (o CGcontext ... alternativa).

Probabilmente closePath tiene conto della larghezza della riga e di altri parametri di linea per formare un poligono correttamente chiuso e regola il percorso stesso da chiudere correttamente. Questo diventa più probabile quando si cancella l'angolo in alto a destra (per trasformarlo in un triangolo) e si nota che lo stile di linea non funzionerà più, solo lo closePath ti dà un bel triangolo.