IssamTP
IssamTP

Reputation: 2440

CoreGraphics FillPath And Stroke Path

I need to draw an hexagon and fill it with a color build with an Image as pattern. I did:

CGContextSaveGState(context);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetFillColorWithColor(context, [[UIColor colorWithPatternImage:[UIImage imageNamed:@"patternerba.png"]] CGColor]);
CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]);
CGContextSetLineWidth(context, 3.0);
// drawing hexagon here...
CGContextStrokePath(context);
CGContextFillPath(context);
[[NSString stringWithFormat:@"Foo"] drawAtPoint:innerRect.origin withFont:[UIFont fontWithName:@"Helvetica" size:16]];
CGContextRestoreGState(context);

But depending from the order of CGContextStrokePath and CGContextFillPath, I get an hexagon bordered but not filled or filled but not bordered. How can I fix this?

Upvotes: 22

Views: 8762

Answers (2)

Jeow Li Huan
Jeow Li Huan

Reputation: 3796

Either use

CGContextDrawPath(context, kCGPathFillStroke);

as sch suggested, or draw the hexagon again before calling FillPath. StrokePath and FillPath remove the path that you have added to the context, thus the next call will silently fail without a path.

CGPathRef path = /* drawing hexagon here */;
CGContextAddPath(context, path);
CGContextStrokePath(context);
CGContextAddPath(context, path);
CGContextFillPath(context);

Note: the two segments of code are not equivalent and gives different result.

Upvotes: 0

sch
sch

Reputation: 27506

Try

CGContextDrawPath(context, kCGPathFillStroke);

Instead of

CGContextStrokePath(context);
CGContextFillPath(context);

Upvotes: 37

Related Questions