2013-05-09 15 views
7

Ho problemi con il disegno di linee che sono accarezzate con un colore e quindi riempiendo le parti interne (fanno un poligono) con un altro.Disegnare un poligono con un colore per il tratto e uno diverso per il riempimento?

UIColor *houseBorderColor = [UIColor colorWithRed:(170/255.0) green:(138/255.0) blue:(99/255.0) alpha:1]; 
CGContextSetStrokeColorWithColor(context, houseBorderColor.CGColor); 
CGContextSetLineWidth(context, 3); 

// Draw the polygon 
CGContextMoveToPoint(context, 20, viewHeight-19.5); 
CGContextAddLineToPoint(context, 200, viewHeight-19.5); // base 
CGContextAddLineToPoint(context, 300, viewHeight-119.5); // right border 
CGContextAddLineToPoint(context, 120, viewHeight-119.5); 
CGContextAddLineToPoint(context, 20, viewHeight-19.5); 

// Fill it 
CGContextSetRGBFillColor(context, (248/255.0), (222/255.0), (173/255.0), 1); 
//CGContextFillPath(context); 

// Stroke it 
CGContextStrokePath(context); 

Con il CGContextStrokePath commentata, ottengo questo risultato:

enter image description here

Ma se io Decommentare CGContextStrokePath e compilare il poligono, il colore trabocca i colpi:

enter image description here

Come si ottiene un risultato come questo (senza dover ripetere il wh Procedura di disegno ole due volte):

enter image description here

risposta

16

È possibile utilizzare

CGContextDrawPath(context, kCGPathFillStroke); 

anziché

CGContextFillPath(context); 
CGContextStrokePath(context); 

Il problema è che sia CGContextFillPath() e CGContextStrokePath(context) chiaro il percorso corrente, in modo che solo la prima operazione riesce, e la seconda operazione non disegna nulla. CGContextDrawPath() combina riempimento e corsa senza cancellando il percorso in mezzo.

+0

Non voglio sembrare impegnativo, ma potresti eventualmente elaborare una risposta completa, perché non riesco a capire dove dovrebbe andare il 'CGContextDrawPath()'? –

+3

Scusa, la risposta è stata così breve perché sono al telefono :-) Questa chiamata sostituisce sia CGContextFillPath che ... StrokePath. –

+0

Questa è la soluzione migliore in questo caso. – alastair

2

Quando si traccia o un riempimento il percorso nel contesto, il contesto rimuove il percorso per voi (si aspetta che si tratta di lavoro è fatto). È necessario aggiungere nuovamente il percorso se si desidera riempirlo dopo averlo accarezzato.

Probabilmente è meglio creare una variabile locale CGPathRef path, creare il percorso, aggiungerlo, accorciare, aggiungerlo di nuovo, riempire.

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, nil, 20, viewHeight-19.5); 
CGPathAddLineToPoint(path nil, 200, viewHeight-19.5); // base 
CGPathAddLineToPoint(path nil, 300, viewHeight-119.5); // right border 
CGPathAddLineToPoint(path nil, 120, viewHeight-119.5); 
CGPathAddLineToPoint(path nil, 20, viewHeight-19.5); 

CGContextAddPath(context, path); 
CGContextFillPath(context); 

// possibly modify the path here if you need to 

CGContextAddPath(context, path); 
CGContextStrokePath(context); 
+0

Potrebbe illustrare la creazione 'path' utilizzando il codice che ho fornito? –

+1

Dovresti utilizzare [API CGPath] (https://developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html) anziché [CGContext] (https: // developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/CGContext/Reference/reference.html) per creare il percorso. Tuttavia, in questo caso, dovresti probabilmente usare 'CGContextDrawPath()', poiché il problema che stai avendo è che il percorso è stato rimosso dal contesto da 'CGContextFillPath()' (e quindi stai tracciando un percorso vuoto, ecco perché non succede nulla). – alastair

+0

Apprezzo molto che tu abbia dedicato del tempo per spiegare questo concetto, questo rende tutto molto più chiaro per quanto riguarda CGContext! Grazie! –

5

Utilizzando UIBezierPath si potrebbe fare questo:

UIBezierPath *path = [[UIBezierPath alloc] init]; 
[path moveToPoint:CGPointMake(20, viewHeight-19.5)]; 
[path addLineToPoint:CGPointMake(200, viewHeight-19.5)]; 
[path addLineToPoint:CGPointMake(300, viewHeight-119.5)]; 
[path addLineToPoint:CGPointMake(120, viewHeight-119.5)]; 
[path addLineToPoint:CGPointMake(20, viewHeight-19.5)]; 

[[UIColor colorWithRed:(248/255.0) green:(222/255.0) blue:(173/255.0) alpha:1.0] setFill]; 
[path fill]; 
[[UIColor colorWithRed:(170/255.0) green:(138/255.0) blue:(99/255.0) alpha:1.0] setStroke]; 
[path stroke]; 
+0

Conosco UIBezierPath solo dagli esempi di mele, ha qualche vantaggio rispetto al metodo 'CGContext' che ho visto nella mia domanda? @MikePollard –

+2

Penso solo ai soliti vantaggi dell'uso di NSObjects piuttosto che degli oggetti della Core Foundation. –