UIView drawRect 绘制的线条宽度错误

5

我想在我的UIView底部添加一条小红线。

我希望这条线是1像素的。

有人可以告诉我为什么以下代码:

- (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);
}

绘制一条高度为2像素的线?

3个回答

14

整数坐标表示像素之间的中间位置;也就是说,(0,0) 位于左上角,在左上角像素的上方和左侧;同样地,(1,0) 位于第一个和第二个像素之间;最后,(0.5,0.5) 位于左上角像素的中心。

根据 CGContextSetLineWidth 的文档, "描边时,线条跨越路径,总宽度的一半在路径的一侧。" 因此,如果路径恰好处于像素之间,线条将在一个像素行上描绘一半,在另一个像素行上描绘另一半。

因此,要获得清晰的像素线条,必须将坐标偏移半个像素:对于您的 x 坐标,请使用 rect.size.height - 7.5 而不是 - 7

顺便提一下,绘制矩形时,使用 CGRectInset(rect, 0.5, 0.5) 很方便。


+1 这是非常奇怪的行为,但它确实有效。我真的被这个问题难住了。 - bentford

1

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

(坐标系设置为这样是为了使相同的代码在所有型号上产生相同的输出。)


2
在普通显示器上为一像素粗的线条,在Retina显示器上应该为两像素粗。 - David M.

0

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


是的,这些线看起来像是被反锯齿处理了,但是当我关闭反锯齿处理时,它们仍然看起来那样。 - Ale Morales

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接