2010-10-04 66 views
0

我正在寫一些代碼來熟悉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的一些基礎知識,有誰能幫忙嗎?

大衛

回答

1

幾件事情。

首先,Porter-Duff混合模式只能保證在基於位圖的上下文中工作。 (即由CGBitmapContextCreate創建的上下文)

其次,kCGBlendModeClear定義爲R = 0 - 它甚至不檢查src或dst像素。所以即使不能保證在這裏工作,它似乎是正常工作。

(見CGContext.h爲更好的解釋比文檔給。)

+0

2 subquestion:1)你看到kCGBlendModeClea作爲落實橡膠工具,一個可行的辦法? 2)你能告訴我更多關於R的知識嗎? – nutsmuggler 2010-10-05 13:03:43

+1

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

+0

謝謝!我曾猜測ModeCLear不是答案,但很高興有確認。 – nutsmuggler 2010-10-06 13:11:32

1

對於kCGBlendModeClear工作的觀點不能是不透明的,不能有背景色設置。

此外,下面一行是不必要的,因爲kCGBlendModeClear不關心填充顏色:

CGContextSetFillColorWithColor(ctx, [UIColor clearColor].CGColor); 
相關問題