使用CGContextAddLineToPoint和CGContextSetLineWidth绘制一条非常细的线

时间:2012-10-14 02:21:15

标签: ios ios5 core-graphics ios6 drawrect

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

你可以看到两者之间的差异 - 红线(宽度= 1)比紫/蓝线(宽度= 0.5)薄得多。

Border drawn with CALayer

以下是我绘制伪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版本宽度相同的自定义行?

2 个答案:

答案 0 :(得分:38)

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

如果路径沿两个像素之间的边缘运行,则笔划将(部分)覆盖该边缘两侧的像素。线宽为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));

答案 1 :(得分:16)

当不在积分上绘制时,您需要关闭抗锯齿以获得细线。

CGContextSetShouldAntialias(ctx, NO)