7
votes

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

J'ai du mal à dessiner des lignes qui sont caressées avec une couleur, puis de remplir leur intérieur (ils font un polygone) avec un 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);


0 commentaires

3 Réponses :


2
votes

Lorsque vous cèdez ou remplissez le chemin dans le contexte, le contexte supprime le chemin pour vous (il s'attend à ce que ce soit effectué). Vous devez ajouter le chemin à nouveau si vous voulez le remplir après le caresser.

Il est probablement préférable de créer un Chemin CGPathRef code> variable locale, construire le chemin, ajoutez, accident vasculaire cérébral, ajoutez-le à nouveau, Remplissez. P>

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


3 commentaires

Pourriez-vous élaborer sur la création à l'aide du code que j'ai fourni?


Vous utiliseriez le CGPATH API plutôt que CGContext créer le chemin. Cependant, dans ce cas, vous devriez probablement utiliser cgcontextDrawpath () , car le problème que vous rencontrez est bien que le chemin est supprimé du contexte par le cgcontexDillPath () (Et vous caressez donc un chemin vide, c'est pourquoi rien ne se passe).


J'apprécie vraiment que vous preniez le temps d'expliquer ce concept, cela rend tout beaucoup plus clair en ce qui concerne CGContext! Merci!



18
votes

Vous pouvez utiliser

CGContextFillPath(context);
CGContextStrokePath(context);


4 commentaires

Je ne veux pas sembler exigeant, mais pourriez-vous éventuellement élaborer de manière à faire une réponse complète, car je ne comprends pas bien où le cgcontextDrawpath () devrait aller?


Désolé, la réponse était si courte parce que je suis au téléphone :-) Cet appel remplace à la fois le cgcontextFillpath et ...


C'est la meilleure solution dans ce cas.


(Roule les yeux.) Bien sûr ... TrackPath, plutôt que pour la facelle ou la mort. Il y a (Apple) logique là quelque part! Merci pour la pointe ... J'avais le même problème.



5
votes

Utiliser UIBZierPath Vous pouvez le faire:

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


2 commentaires

Je connais UibezierPathe uniquement des exemples Pommes, a-t-il des avantages, par opposition à CGContext METHODE OWDID dans ma question? @MikePollard


Je pense que tous les avantages habituels de l'utilisation de NsObjects plutôt que des objets de base de base.