核心图形,如何用椭圆透明孔绘制一个矩形?

时间:2011-07-29 00:14:43

标签: iphone core-graphics quartz-graphics

我正在尝试绘制一个椭圆形挖空的320x480矩形。 想象一下,在矩形上绘制一个填充的矩形,一个填充的椭圆,然后从矩形中移除椭圆,留下一个透明孔。

- (void)drawRect:(CGRect)rect
{
        // Drawing code.
    CGContextRef context = UIGraphicsGetCurrentContext();
    // Set color to red
    CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);
    // Add rectange
    CGContextAddRect(context, rect);
    // Fill rectange
    CGContextFillRect(context, rect);

    // Create a elipse to be removed from rectange

    CGPathRef circlePath = CGPathCreateMutable();       
    CGPathAddEllipseInRect(circlePath , NULL , elipseRect);

    CGContextAddPath(context, circlePath);  
    CGContextSetRGBFillColor(context, 1.0, 1.0, 0.0, 1.0);
    CGContextFillPath(context);

    // clip elipse... (DO NOT WORK)
    CGContextEOClip(context);
}

当我尝试从矩形移除椭圆时,它不起作用。

有人有解决方案吗?

1 个答案:

答案 0 :(得分:12)

这不是我的头脑,但是......

CGPathRef cutoutRect = CGPathCreateMutable();       
CGPathAddRect(cutoutRect, NULL, rect);
CGPathAddEllipseInRect(cutoutRect, NULL, ellipseRect);

CGContextAddPath(context, cutoutRect);  
CGContextSetRGBFillColor(context, 1.0, 1.0, 0.0, 1.0);
CGContextFillPath(context);

您实际上可能需要使用CGContextEOFillPath,我绝不能keep them straight。 {/ 1}}类型函数应该在绘图之前使用而不是之后,但在这种情况下它们可能不是必需的。

也就是说,您不应该在CGContextClip实现中执行此操作,但路径应设置在-drawRect:上,该CAShapeLayer是此视图的子图层,或者是其唯一的图层,或者,实际上,如果可能的话,使用一个代替此视图的层。

另请注意,传递到drawRect:的矩形可能只是整个视图的一部分,因此您的代码将会有一些非常奇怪的结果。您的意思是self.bounds吗?