【问题标题】:Drawing a very thin line with CGContextAddLineToPoint and CGContextSetLineWidth用 CGContextAddLineToPoint 和 CGContextSetLineWidth 画一条很细的线
【发布时间】:2012-10-14 02:21:15
【问题描述】:

我想在 UIView 的 drawRect 方法中绘制一条非常细的细线宽度。我看到的 CGContextSetLineWidth 值为 0.5 的线与用于绘制边框 CALayer 的 1.0 宽度值不匹配。

您可以看到两者之间的区别 - 红色线(宽度 = 1)比紫色/蓝色线(宽度 = 0.5)细很多。

这是我绘制伪 1.0 宽度水平线的方式:

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor);
CGContextSetLineWidth(ctx, 0.5); // I expected a very thin line

CGContextMoveToPoint(ctx, 0, y);
CGContextAddLineToPoint(ctx, self.bounds.size.width, y);

CGContextStrokePath(ctx);

这是同一个视图的边框,这次使用 1.0 边框宽度:

UIView *myView = (UIView *)self;
CALayer *layer = myView.layer;
layer.borderColor = [UIColor redColor].CGColor;
layer.borderWidth = 1.0;

我需要做些什么不同的事情来绘制我自己的与 CALayer 版本宽度相同的自定义线?

【问题讨论】:

    标签: ios ios5 core-graphics ios6 drawrect


    【解决方案1】:

    当您描边路径时,描边会跨越路径。换句话说,路径位于笔画的中心。

    如果路径沿着两个像素之间的边缘延伸,则笔触将(部分)覆盖该边缘两侧的像素。线宽为 0.5 时,水平笔划将延伸到路径上方的像素中 0.25 点,延伸到路径下方的像素中 0.25 点。

    您需要移动路径,使其不会沿着像素边缘运行:

    CGFloat lineWidth = 0.5f;
    CGContextSetLineWidth(ctx, lineWidth);
    
    // Move the path down by half of the line width so it doesn't straddle pixels.
    CGContextMoveToPoint(ctx, 0, y + lineWidth * 0.5f);
    CGContextAddLineToPoint(ctx, self.bounds.size.width, y + lineWidth * 0.5f);
    

    但由于你只是画一条水平线,所以使用CGContextFillRect更简单:

    CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
    CGContextFillRect(ctx, CGRectMake(0, y, self.bounds.size.width, 0.5f));
    

    【讨论】:

    • 这是一种魔法!它有效,但你能解释一下为什么我应该将路径向下移动一半的线宽或提供一些链接吗?
    • 但他只是解释得这么清楚,用 6 行清晰的文字……画细线时避免跨越像素边界。绘图机制的抗锯齿会创建“模糊”线,在视觉上看起来比您预期的要粗,但事实并非如此。
    【解决方案2】:

    您需要关闭抗锯齿以获得未在积分上绘制的细线。

    CGContextSetShouldAntialias(ctx, NO)
    

    【讨论】:

    • 很高兴能帮上忙,我自己也经常忽略抗锯齿问题。
    • 我在 iOS7 应用程序上工作,视网膜上 1 像素线,这个命令没有影响。 YMMV。
    • 这比移动路径要好,这样它就不会跨越像素。谢谢。
    • 我会手动移离像素边界,并避免关闭抗锯齿,因为当抗锯齿开启时,视图中的大多数绘图看起来要好得多调用上述所有对角线和曲线都会看起来锯齿状命令。
    • 您只为自己的绘图代码关闭抗锯齿。不言而喻,应该保存和弹出绘图上下文以养成良好的编码习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多