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:
Mais si je décommenter CGContextStrokePath
et remplir le polygone, la couleur déborde les traits:
Comment obtenez-vous un résultat comme celui-ci (sans avoir à refaire deux fois la procédure de dessin):
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);