我正在编写一些代码来熟悉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
答案 0 :(得分:1)
一些事情。
首先,Porter-Duff混合模式仅保证在基于位图的上下文中起作用。 (即CGBitmapContextCreate
)
其次,kCGBlendModeClear
定义为R = 0
- 它甚至不检查src或dst像素。因此即使它不能保证在这里工作,它似乎正常工作。
(请参阅CGContext.h
以获得比文档更好的解释。)
答案 1 :(得分:1)
要让kCGBlendModeClear
工作,视图不能是不透明的,并且不能设置背景颜色。
此外,以下行是不必要的,因为kCGBlendModeClear
不关心填充颜色:
CGContextSetFillColorWithColor(ctx, [UIColor clearColor].CGColor);