2012-01-31 53 views
3

雖然在iOS的UIView中繪製矩形,但我仍然遇到同樣的問題:矩形邊距將它們的顏色與背景混合在一起。我嘗試了幾個具有相同結果的矩形繪圖方法 - 使用貝塞爾路徑,逐行繪製邊框,並填充矩形的內部。如何在繪製矩形時避免顏色混合?

視圖的框架本身總是正確繪製。每當我需要一個矩形時,我甚至考慮過使用視圖,但是這看起來並不是正確的方式來做特別的事情,因爲我需要畫很多東西。

這是我的問題的一個例子。爲了便於比較,我畫一個長方形的綠色視圖與同尺寸:

CGRect horizontalBar = CGRectMake(2, 2, 10, 6); 

UIView* horizontalBarSubView = [[UIView alloc] initWithFrame:horizontalBar]; 
horizontalBarSubView.backgroundColor = [UIColor greenColor]; 
[self addSubview:horizontalBarSubView]; 
[horizontalBarSubView release]; 

而對於矩形本身:

CGRect horizontalBar = CGRectMake(2, 20, 10, 6); 

UIBezierPath* horizontalBarPath = [UIBezierPath bezierPathWithRect:horizontalBar]; 
[[UIColor greenColor] set]; 
[horizontalBarPath fill]; 

這揮動以下結果(10倍變焦):

10x zoom rectangle test

是什麼導致顏色混合?

我該如何避免這種情況?

回答

2

@Almo是正確的,你的問題是反鋸齒,但你確定這是實際的代碼和值?這不應該反別名,我的測試顯示它沒有。爲了得到你的結果,我必須改變你的結果:

CGRect horizontalBar = CGRectMake(2.5, 20.5, 10, 6); 

填充到分數像素上的路徑會給你你看到的效果。另外,在具有奇數寬度的整數像素上撫摸路徑將以這種方式消除混疊。 (所有在非Retina顯示屏上; Retina略有不同。)

我通常不建議關閉消除鋸齒,因爲@Almo建議。相反,你只需要確保你的路徑繪製或填充整個像素。

這是覆蓋在更詳細地的iOS 5 Programming Pushing the Limits第6章,第114頁。

+0

你說得對,我正在繪製一個視圖,該視圖已經在兩個軸上都設置了半像素。 – rahzark 2012-02-03 10:36:07

2

您是否嘗試過使用CGContext進行混淆?

CGContextSetShouldAntialias

看圖形上下文設置在這裏。

http://www.apeth.com/iOSBook/ch15.html

「當你在一個圖形上下文繪製,繪圖服從上下文的當前設置。因此,該程序總是配置首先設置上下文的設置,然後繪製。「

你會想要一個沒有設置CGContextSetShouldAntialias標誌的上下文。

雖然正如評論中所述,這將填充否則將與矩形顏色混合的像素。

+0

這確實工作,儘管矩形最終填充所述融合像素,這使得它們(矩形)厚。 – rahzark 2012-02-03 10:50:13

+0

有趣。謝謝(你的)信息! – Almo 2012-02-03 14:30:51