kCGBlendModeClear不清楚,为什么?

时间:2010-10-04 17:53:56

标签: iphone core-graphics quartz-graphics

我正在编写一些代码来熟悉Quartz 2d的基础知识。 我正在尝试绘制和图像,然后通过kCGBlendModeClear混合模式清除它。这是我的UIView子类代码的代码,其背景颜色通过IB设置为橙色:

- (void)drawRect:(CGRect)rect {

    UIImage *brush = [UIImage imageNamed:@"brush.png"] ;
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextSetBlendMode(ctx,kCGBlendModeNormal ); 
    CGContextDrawImage(ctx, CGRectMake(100, 100, 26, 25), [brush CGImage]);

    CGContextSetBlendMode(ctx, kCGBlendModeClear);

    CGContextSetFillColorWithColor(ctx, [UIColor clearColor].CGColor);

    CGContextFillEllipseInRect(ctx, CGRectMake(110, 110, 5, 5)); // HERE!
}

阅读文档和this question我认为HERE标记的行会在我之前绘制的图像中产生一个洞。相反,它会在上面创建一个黑色圆圈(应该是橙色)。

要进行调试,我尝试在橙色uiview上添加自定义视图。这次我的自定义视图有黑色背景。这条线的洞是正确的,但我想知道为什么黑色的视图。更奇怪的是,如果我执行myView.backgroundColor,我可以设置背景颜色(这不应该被我的drawRect实现覆盖吗?)。

我显然缺少Quartz的一些基础知识,有人可以帮忙吗?

的Davide

2 个答案:

答案 0 :(得分:1)

一些事情。

首先,Porter-Duff混合模式仅保证在基于位图的上下文中起作用。 (即CGBitmapContextCreate

创建的上下文

其次,kCGBlendModeClear定义为R = 0 - 它甚至不检查src或dst像素。因此即使它不能保证在这里工作,它似乎正常工作。

(请参阅CGContext.h以获得比文档更好的解释。)

答案 1 :(得分:1)

要让kCGBlendModeClear工作,视图不能是不透明的,并且不能设置背景颜色。

此外,以下行是不必要的,因为kCGBlendModeClear不关心填充颜色:

CGContextSetFillColorWithColor(ctx, [UIColor clearColor].CGColor);