我正在寫一些代碼來熟悉Quartz 2d的基礎知識。 我正在嘗試繪製圖像,然後通過kCGBlendModeClear混合模式將其清除。下面是我的UIView
子類代碼的代碼,其背景顏色是通過IB設置爲橙色:我認爲行標這裏會產生我以前繪製的圖像中的孔kCGBlendModeClear不清楚,爲什麼?
- (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。相反,它會在其上創建一個黑色圓圈(應該是橙色)。
爲了調試,我嘗試通過橙色的uiview添加自定義視圖。這次我的自定義視圖有黑色背景。線HERE的洞是正確的,但我想知道爲什麼黑色的視圖。更奇怪的是,如果我做了我的View.backgroundColor,我可以設置一個背景顏色(不應該被我的drawRect實現覆蓋)?
我明顯缺少Quartz的一些基礎知識,有誰能幫忙嗎?
大衛
2 subquestion:1)你看到kCGBlendModeClea作爲落實橡膠工具,一個可行的辦法? 2)你能告訴我更多關於R的知識嗎? – nutsmuggler 2010-10-05 13:03:43
1)編號'R = 0'很沒用,你甚至不能設置清晰的顏色。 2)混合模式可以用R,S和D表示,其中S是源像素,D是目標像素,R是結果像素。這給你一個方便的簡寫來描述混合模式,例如'R = S + D *(1-Sa)'用於源代碼覆蓋('kCGBlendModeNormal')。在CGContext.h開始的註釋中已經很好地解釋了它:84 – 2010-10-05 17:02:58
謝謝!我曾猜測ModeCLear不是答案,但很高興有確認。 – nutsmuggler 2010-10-06 13:11:32