5

我正在尝试在 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 的线?

4

3 回答 3

14

积分坐标表示像素之间的中间位置;即 (0,0) 位于左上角,左上角像素的上方和左侧;类似地,(1,0)第一和第二像素之间;最后,(0.5,0.5) 位于左上角像素的中心。

根据CGContextSetLineWidth 的文档,“当描边时,线条横跨路径,两侧各占总宽度的一半。” 因此,如果路径恰好位于像素之间,则线条将在一行像素上画出一半,在另一行上画出一半。

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

顺便说一句,在绘制矩形时,使用它CGRectInset(rect, 0.5, 0.5)来实现这一点很方便。

于 2010-09-07T17:49:44.670 回答
1

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

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

于 2010-09-07T17:34:24.183 回答
0

默认情况下,线条是抗锯齿绘制的(除非您另外配置)。因此,任何不是严格垂直或水平且以像素为起点和终点的线都可能部分覆盖某些行和/或列中的多个像素,使其看起来像一条更宽的灰色线,而不是一条高对比度的细线。

于 2010-09-07T18:40:55.213 回答