2010-09-07 96 views
4

我想在我的UIView底部添加一點紅線。UIView drawRect繪製寬度錯誤的線

我想這條線是1px線。

誰能告訴我,爲什麼下面的代碼:

- (void)drawRect:(CGRect)rect { 
CGContextRef currentContext = UIGraphicsGetCurrentContext(); 
CGContextSaveGState(currentContext); 
CGContextSetRGBFillColor(currentContext, 0.0f, 0.0f, 0.0f, 1.0f); 
CGContextFillRect(currentContext, RECT(0, 0, rect.size.width, rect.size.height - 8)); 
CGContextSetLineWidth(currentContext, 1); 
CGContextSetRGBStrokeColor(currentContext, 1.0f, 0.0f, 0.0f, 1.0f); 
CGContextBeginPath(currentContext); 
CGContextMoveToPoint(currentContext, 0, rect.size.height - 7); 
CGContextAddLineToPoint(currentContext, rect.size.width, rect.size.height - 7); 
CGContextStrokePath(currentContext); 
CGContextRestoreGState(currentContext); 
} 

繪製在高度跨越2px的一條線嗎?

回答

13

積分座標表示的地方像素之間的一半;即(0,0)位於左上角之上並且位於左上角像素的左側;類似地,(1,0)是之間的第一和第二像素;最後,(0.5,0.5)位於左上像素的中心。

根據the documentation for CGContextSetLineWidth,「當撫摸時,線橫跨路徑,兩邊的總寬度的一半。」因此,如果路徑精確地位於像素之間,則該線將在一行像素上一半,另一半在另一行上。

因此,要獲得清晰的像素線,必須將座標偏移半個像素:對於您的x座標,請使用rect.size.height - 7.5而不是- 7

順便說一下,繪製矩形時,使用CGRectInset(rect, 0.5, 0.5)來實現這一點很方便。

+0

+1這是一種奇怪的行爲,但確實有效。我真的被這個難住了。 – bentford 2012-11-01 18:27:32

1

你使用iPhone 4嗎? iPhone 4使用比例因子爲2的座標系。因此,您需要將線寬設置爲0.5才能得到您想要的。

(所以相同的代碼產生的所有車型相同的輸出座標系設置了這種方式。)

+2

在普通顯示器*上一條像素厚的線在Retina顯示器上應該是兩個像素厚。 – 2010-09-07 22:37:17

0

行默認情況下繪製反鋸齒(除非您另行配置)。因此,任何不嚴格垂直或水平並且以像素開始和結束的線都可能部分覆蓋某些行和/或列中的多個像素,使其看起來像更寬的灰線而不是更細的高對比線。

+0

是的行看起來像他們正在antialiased,但是當我打開antialiasing,他們仍然看起來這樣。 – almosnow 2010-09-07 19:38:39