Dessiner un polygone avec une couleur pour le trait, et un autre pour le remplissage?

J'ai du mal à dessiner quelques lignes qui sont caressées avec une couleur et ensuite remplir leurs entrailles (elles font un polygone) avec une autre.

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); 

Avec le CGContextStrokePath commentaire, j'obtiens ce résultat:

entrez la description de l'image ici

Mais si je décommenter CGContextStrokePath et remplir le polygone, la couleur déborde les traits:

entrez la description de l'image ici

Comment obtenez-vous un résultat comme celui-ci (sans avoir à refaire deux fois la procédure de dessin):

entrez la description de l'image ici

    Vous pouvez utiliser

     CGContextDrawPath(context, kCGPathFillStroke); 

    au lieu de

     CGContextFillPath(context); CGContextStrokePath(context); 

    Le problème est que CGContextFillPath() et CGContextStrokePath(context) le path actuel, de sorte que seule la première opération réussisse et la deuxième opération ne dessine rien. CGContextDrawPath() combine le remplissage et le trait sans effacer le path entre les deux.

    UIBezierPath vous permet de faire ceci:

     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]; 

    Lorsque vous effleurez ou remplissez le path dans le context, le context supprime le path pour vous (il s'attend à ce que le travail soit terminé). Vous devez à nouveau append le path si vous voulez le remplir après l'avoir effleuré.

    Il est probablement préférable de créer une variable locale de CGPathRef path , de build le path, de l'append, de le contourner, de l'append à nouveau, de le remplir.

     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);