2010-09-07 62 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