我画这样的线:
- (void)drawRect:(CGRect)rect {
_lineColor = [UIColor blackColor];
[_lineColor setStroke];
[_lineColor setFill];
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextClearRect(c, rect);
[[UIColor clearColor] setFill];
CGContextAddRect(c, rect);
CGContextSetLineWidth(c, 1);
CGContextDrawPath(c, kCGPathFill);
CGContextBeginPath(c);
CGContextMoveToPoint(c, 0, 0);
CGContextAddLineToPoint(c, x1, y1);
CGContextStrokePath(c);
}
但是,我的线有不同的宽度,即90度或45度角。如何绘制相同宽度的线
最佳答案
我整理了一些可能使此处效果更明显的东西。这是代码:
- (void)drawRect:(CGRect)rect
{
CGContextRef c = UIGraphicsGetCurrentContext();
// Get us a gray background
CGContextSetFillColorWithColor(c, [[UIColor grayColor] CGColor]);
CGContextFillRect(c, CGRectInfinite);
CGContextSetStrokeColorWithColor(c, [[UIColor blackColor] CGColor]);
CGContextSetLineWidth(c, 1.0);
CGContextBeginPath(c);
// Draw some lines at various angles
for (CGFloat i = -10.; i <= 10.; i += 1.0)
{
CGContextMoveToPoint(c, CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
CGContextAddLineToPoint(c, CGRectGetMidX(self.bounds) + i * 10., CGRectGetMidY(self.bounds) + 100);
}
CGContextStrokePath(c);
}
这是视网膜设备上该代码的输出:(这应该以标准StackOverflow格式显示为100%,但是可以确保以全尺寸查看它)
现在这是炸毁的一部分:
您在这里看到的是工作中的抗锯齿。对于初学者来说,垂直线一直都是2.0像素,没有抗锯齿(假设您在像素边界上绘制)。现在考虑使用相同的像素网格绘制的45度线,并采用勾股定理。这是另一张图:
在最窄处(即与线本身垂直的尺寸),一条45度的线将显示为1.414px宽,并且在其最宽的不透明部分(不包括弥合锯齿状间隙中大部分透明的像素),它将跨过2.828像素。炸毁后,您可以看到为消除这些线条的锯齿所做的工作如何影响线条的光学外观。
可能有人会建议您关闭抗锯齿功能,但是作为参考,这会使光学效果更糟(因为光栅化器将使覆盖范围内的每个像素完全不透明):
简而言之,这是预期的行为,如果您需要调整绘制每条线的方式以实现默认抗锯齿代码未提供的某些所需的光学外观,则只需执行此操作即可。 CoreGraphics中没有“使我的所有线条在光学上都相似”的设置-在一般情况下,如果您需要更具体的内容,它们会尽力而为。 FWIW,许多应用程序仅使用默认值,人们对结果似乎很满意,因此您可能会问自己,这是否真的是应用程序中您想要进行大量额外工作的地方。
它发生在我身上:我不确定您是否会喜欢这种效果,但是一种实现光学相似性的可能方法可能是绘制垂直线而不是在像素边界上。这也将导致它们出现抗锯齿,这(取决于您的外观)可能会使它们看起来与倾斜的抗锯齿线更加一致。看起来像这样:
您这样做所失去的是对线条的某种“虚度”。通过将上下文在X方向上平移0.25pt(对于视网膜-对于非视网膜,0.5pt会产生类似的效果),可以最轻松地绘制像素边界:
CGContextTranslateCTM(c, 0.25, 0);
希望这可以帮助。
关于ios - 其他角度的线宽,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18050677/