【问题标题】:CGContext line widthCGContext 线宽
【发布时间】:2013-08-27 00:11:21
【问题描述】:

我正在尝试画一条简单的线,问题是它的宽度不是 1 像素,而是 2。文档指出,如果我正确阅读,用户空间单位将转换为像素。

代码很简单,但我的线总是 2 像素宽。

//Get the CGContext from this view
CGContextRef context = UIGraphicsGetCurrentContext();
//Set the stroke (pen) color
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);

//Set the width of the pen mark
CGContextSetLineWidth(context, 1);

for (int i = 1; i <= sections - 1; i++)
{
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(0.0, i * kSectionHeight)];

    CGContextMoveToPoint(context, 0.0, i * kSectionHeight); //Start point
    CGContextAddLineToPoint(context, self.frame.size.width, i * kSectionHeight);
}

CGContextStrokePath(context);

【问题讨论】:

标签: ios quartz-core


【解决方案1】:

没有点不能转换为像素。 如果您的线太粗,请更改该值。

【讨论】:

  • 扩展它。点在 API 中与设备分辨率无关。 Apple 将确定给定 Apple 设备的点数。显示器不仅有像素,还有像素大小和间距。 Apple 将确定什么最能代表其硬件上的一个点。
  • 好的,问题就在这里。如何更改值?如果我给出一个 0.5 而不是 1 的值,线条的宽度是相同的,但只是一个较浅的阴影?必须承认我在这里迷路了......
  • 所以你遇到了抗锯齿。线条较细,但未对齐像素。见stackoverflow.com/questions/11176560/…
  • 是的,就是这样。习惯用字符串处理,只是我没有想到这里。谢谢!
【解决方案2】:

我在测试应用中尝试了以下操作:

CGFloat desiredWidthInPixels = 1.0f;
CGFloat lineWidth = desiredWidthInPixels / [[UIScreen mainScreen] scale];
NSLog(@"lineWidth = %f", lineWidth);

我得到了 0.5f 的 lineWidth,它应该准确地转换为屏幕上的单个像素宽度(因为比例为 2.0,表示“Retina”设备)。这应该在不同屏幕尺寸的设备上正确适应。

***警告:当然,这只有在 [[UIScreen mainScreen] scale] 像现在这样运行时才有效。

【讨论】:

  • 正如我上面提到的,当我给出 0.5 的值时,线条的宽度相同。但是,如果我使用上面的代码和模拟器的视网膜版本,那么这条线是 1 像素宽。所以它似乎在视网膜屏幕上做正确的事情,但在非视网膜屏幕上却不行。
  • 在非视网膜屏幕上,上面的代码应该给出 1.0 的线宽,因为比例将为 1.0。这不是你看到的吗?
  • 是的,非视网膜为 1,视网膜为 0.5。但是由于上面帖子中讨论的抗锯齿,仍然没有正确绘制。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多