绘制一个多边形的多边形用于描边,另一个用于填充?

时间:2013-05-09 13:08:23

标签: ios objective-c uiview cgcontext

我在绘制一些用颜色描边的线条然后用另一条线填充它们的内部(它们形成一个多边形)时遇到了麻烦。

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

CGContextStrokePath注释掉后,我得到了这个结果:

enter image description here

但如果我取消注释CGContextStrokePath并填写多边形,颜色会溢出笔画:

enter image description here

如何实现这样的结果(无需重做整个绘图程序两次):

enter image description here

3 个答案:

答案 0 :(得分:18)

您可以使用

CGContextDrawPath(context, kCGPathFillStroke);

而不是

CGContextFillPath(context);
CGContextStrokePath(context);

问题在于CGContextFillPath()CGContextStrokePath(context) 清除当前路径,以便只有第一个操作成功,第二个操作成功 操作什么都没有。 CGContextDrawPath()无需填充填充和描边 清除两者之间的路径。

答案 1 :(得分:5)

使用UIBezierPath可以这样做:

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 :(得分:2)

当你在上下文中描边或填充路径时,上下文会为你删除路径(它希望它的工作完成)。如果要在抚摸后填充路径,则必须再次添加路径。

最好创建一个CGPathRef path局部变量,构建路径,添加它,描边,再添加,填充。

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