2009-09-21 35 views
5

我有一個自定義UIView,它使用其-[drawRect:]方法繪製。自定義視圖中的奇怪反鋸齒

問題在於抗鋸齒行爲非常奇怪,因爲黑線水平線或垂直線非常模糊。

如果我禁用了與CGContextSetAllowsAntialiasing的抗鋸齒,則所有內容都按預期繪製。

抗鋸齒:
alt text http://dustlab.com/stuff/antialias.png

無抗鋸齒(這看起來像AA預期的結果):
alt text http://dustlab.com/stuff/no_antialias.png

線寬正好是1,和所有的座標是整數值。

如果我使用CGContextStrokeRect繪製一個矩形,但是如果我繪製完全相同的CGRectUIRectStroke,則會發生同樣的情況。

回答

10

由於行程膨脹等量至兩側,一條線的一個像素寬度的不得將放置在整數座標上,但以0.5像素偏移量放置。

計算描邊線這樣的正確的座標:

CGPoint pos = CGPointMake(floorf(pos.x) + 0.5f, floorf(pos.y) + 0.5f); 

BTW:不要投你的價值觀爲int和背部浮擺脫小數部分。 C中有一個函數floor

+2

除此之外,Apple在Cocoa繪圖指南的「執行像素精確繪圖」部分中提供了一些不錯的提示和示例代碼:http://developer.apple.com/mac/library/documentation/Cocoa/ Conceptual/CocoaDrawingGuide/Transforms/Transforms.html#// apple_ref/doc/uid/TP40003290-CH204-BCICIJAJ – 2009-09-21 16:32:45

+0

這裏是避免沒有任何代碼的簡單方法http://www.techpaa.com/2012/06/avoiding -view-edge-antialiasing.html – ShivaPrasad 2012-06-18 08:31:01

+0

@jeeva'UIViewEdgeAntialiasing'僅適用於圖層的邊緣。問題是關於在Quartz中繪製的線條。 'UIViewEdgeAuthoriasing'不會影響Quartz繪圖。 – 2012-06-20 07:15:24

0

在您的視圖框架中,您可能具有不是整數的浮點值。雖然幀足夠精確做一個像素(浮點)的級分,將得到的模糊,除非你轉換爲int

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....);