【问题标题】:Core Graphics stroke width is inconsistent between lines & arcs?Core Graphics 线条和弧线之间的笔划宽度不一致?
【发布时间】:2010-12-17 18:45:50
【问题描述】:

用例:我将 UIView 子类化以创建一个自定义视图,该视图用圆角矩形“遮盖” UIImage(将图像剪辑为圆角矩形)。代码正在运行;我使用了类似于this question的方法。

但是,我想描边剪切路径以创建一个“框架”。这可行,但弧线笔画看起来与线条笔画明显不同。我尝试将笔触宽度调整为更大的值(我一开始以为是像素化),但抗锯齿似乎以不同的方式处理弧线和线条。

这是我在模拟器上看到的:

这是绘制它的代码:

CGContextSetRGBStrokeColor(context, 0, 0, 0, STROKE_OPACITY);
CGContextSetLineWidth(context, 2.0f);
CGContextAddPath(context, roundRectPath);
CGContextStrokePath(context);

有人知道如何让这些排列顺利吗?

【问题讨论】:

  • 哦,是的,我需要在这里翻转图像 - 它是颠倒的!愚蠢的 iOS 与 Mac OSX 的坐标差异..
  • 你应该使用CGRect b = CGRectInset(self.bounds, strokeWidth/2, strokeWidth/2);,然后再对矩形进行四舍五入并将其添加到上下文中

标签: macos ios core-graphics


【解决方案1】:

…但抗锯齿处理弧线和直线的方式似乎不同。

不,它没有。

你的笔画宽度是一致的——一直都是 2 pt。

问题是您已经剪裁成一个矩形,并且您的形状的边正好位于该矩形边缘的顶部,因此只有矩形内的边的一半被绘制。这就是边缘只有 1 px 宽的原因。

解决方案是不进行裁剪,在裁剪之前将裁剪矩形在每个轴上增加 2 pt,或者将形状的边缘在每侧向内移动 1 pt。 (ETA:或者,是的,做一个内心的笔触。)

【讨论】:

  • 没有办法将笔画放在路径的内部而不是在路径上居中吗?
  • @Gabe:你也可以这样做。 stackoverflow.com/questions/2488115/…
  • 我找到了另一种方法来解决我的用例(一个更简单的方法,doh),但这肯定回答了这个问题。即使我取出剪辑,我仍然遇到问题 - 但“中心笔划”是问题所在:我的帧大小等于我在直边上的路径大小,所以外部像素永远不会显示:它在框架之外。
  • @phooze:图像肯定会显示剪辑,所以如果即使没有剪辑,它也被剪辑,那只是意味着框架为你剪辑,你不需要剪辑。 (Mac OS X 肯定不会这样做,所以如果你删除剪辑然后将此代码移植到 Cocoa,请注意这一点。)
【解决方案2】:

以防万一有人试图做和我一样的事情(圆形矩形图像):

UIImageView 类有一个属性layer,类型为CALayer。 CALayer 已经内置了这个功能(这让我有点惊讶,我在任何地方都找不到它):

UIImageView *thumbnailView = [UIImage imageNamed:@"foo.png"];
thumbnailView.layer.masksToBounds = YES;
thumbnailView.layer.cornerRadius = 15.0f;
thumbnailView.layer.borderWidth = 2.0f;
[self.view addSubview:thumbnailView];

也可以。

【讨论】: