1

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

- (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。只有CGpaths可以被剪裁?任何建议或想法表示赞赏。

谢谢

4

2 回答 2

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);
于 2013-10-08T16:43:52.347 回答
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

于 2013-10-18T12:38:25.367 回答