CGContextClip - 填充交集

时间:2013-10-08 16:00:41

标签: ios core-graphics

我正在尝试一个简单的填充,两个具有相同半径的交叉圆圈,并且单独填充交叉点。下面是我试过的

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(context, 1.0);
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);

   // Draw first circle    
    CGContextAddArc(context, 150, 150, 50, 0, 2 * M_PI, 1);
    CGContextStrokePath(context);

    // Draw second circle
    CGContextAddArc(context, 200, 150, 50, 0, 2 * M_PI, 1);
    CGContextEOClip(context);
    CGContextFillPath(context);

}

我的代码甚至没有在上下文中呈现第二个圆圈。我在论坛中经历了很多与CGContextClip相关的问题,但大多数都在他们的样本中使用了CGPath。只能剪裁CG路径?任何建议或想法都表示赞赏。

谢谢

2 个答案:

答案 0 :(得分:2)

函数CGContextStrokePath()CGContextEOClip()CGContextFillPath() 都清除了当前的路径。因此,最终的CGContextFillPath()无法填充。

现在,以下代码可用于绘制圆圈的交集:

// Use first circle as clipping path:
CGContextAddArc(context, 150, 150, 50, 0, 2 * M_PI, 1);
CGContextClip(context);
// Draw second circle:
CGContextAddArc(context, 200, 150, 50, 0, 2 * M_PI, 1);
CGContextFillPath(context);

更新:以下代码填充并描绘交集:

CGContextSaveGState(context);
CGContextAddArc(context, 150, 150, 50, 0, 2 * M_PI, 1);
CGContextClip(context);
CGContextAddArc(context, 200, 150, 50, 0, 2 * M_PI, 1);
CGContextDrawPath(context, kCGPathFillStroke);
CGContextRestoreGState(context);
CGContextAddArc(context, 200, 150, 50, 0, 2 * M_PI, 1);
CGContextClip(context);
CGContextAddArc(context, 150, 150, 50, 0, 2 * M_PI, 1);
CGContextDrawPath(context, kCGPathStroke);

(不起作用的原始代码:)

要填充并描绘路径,请使用CGContextDrawPath()

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetLineWidth(context, 1.0);
CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);

CGContextAddArc(context, 150, 150, 50, 0, 2 * M_PI, 1);
CGContextAddArc(context, 200, 150, 50, 0, 2 * M_PI, 1);
CGContextDrawPath(context, kCGPathEOFillStroke);

答案 1 :(得分:0)

你试过这个吗?

- (UIImage *)colorImage:(UIImage *)origImage withColor:(UIColor *)color
{
UIGraphicsBeginImageContextWithOptions(origImage.size, YES, 0);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, (CGRect){ {0,0}, origImage.size} );

CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, origImage.size.height);
CGContextConcatCTM(context, flipVertical);
CGContextDrawImage(context, (CGRect){ pt, origImage.size }, [origImage CGImage]);

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return image;
}

您也可以尝试Flood Fill