【问题标题】:UIView drawRect drawing lines of wrong widthUIView drawRect画线宽度错误
【发布时间】:2011-04-09 07:58:15
【问题描述】:

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

【问题讨论】:

    标签: iphone ios uiview uikit drawrect


    【解决方案1】:

    积分坐标表示像素之间的中间位置;也就是说,(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 这是一种奇怪的行为,但它确实有效。我真的被这个难住了。
    【解决方案2】:

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

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

    【讨论】:

    • 一条线在普通显示器上是一个像素粗应该在 Retina 显示器上是两个像素。
    【解决方案3】:

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

    【讨论】:

    • 是的,线条看起来像是被抗锯齿处理了,但是当我关闭抗锯齿功能时,它们看起来还是那样。
    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多