UIView drawRect画线宽度错误

时间:2010-09-07 17:28:03

标签: iphone ios uiview uikit drawrect

我正在尝试在我的UIView底部添加一条红线。

我希望该行为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的线?

3 个答案:

答案 0 :(得分:14)

积分坐标表示像素之间的中间位置;也就是说,(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)来实现这一点非常方便。

答案 1 :(得分:1)

你使用的是iPhone 4吗? iPhone 4使用比例因子为2的坐标系。因此,您需要将线宽设置为0.5才能得到您想要的效果。

(坐标系设置为这样,所以相同的代码在所有模型上产生相同的输出。)

答案 2 :(得分:0)

默认情况下,对线进行抗锯齿处理(除非您另行配置)。因此,任何非严格垂直或水平以及在像素上开始和结束的线都可能部分覆盖某些行和/或列中的多个像素,使其看起来像更宽的灰色线而不是更薄的高对比度线。