核心图形的线宽在直线和弧线之间不一致?

6
应用场景:我正在子类化UIView以创建一个自定义视图,它将UIImage与圆角矩形匹配(将图像剪切为圆角矩形)。 代码可以工作; 我使用了类似于此问题的方法。
然而,我想描绘剪裁路径以创建“框架”。 这个方法可以工作,但弧形笔划看起来明显不同于线条笔划。 我尝试过将笔画宽度调整到更大的值(起初认为这是像素化),但抗锯齿似乎处理弧和线条有所不同。
这是模拟器上显示的内容: Uneven stroke image 这是绘制它的代码:
CGContextSetRGBStrokeColor(context, 0, 0, 0, STROKE_OPACITY);
CGContextSetLineWidth(context, 2.0f);
CGContextAddPath(context, roundRectPath);
CGContextStrokePath(context);

有人知道如何使它们平滑对其吗?

哦,是的,我需要在这里翻转图像 - 它是倒置的!愚蠢的iOS与Mac OSX坐标差异.. - makdad
1
在将矩形四舍五入并添加到上下文之前,您应该使用CGRect b = CGRectInset(self.bounds, strokeWidth/2, strokeWidth/2); - bshirley
2个回答

12

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

不,它没有。

你的笔画宽度保持一致-它在整个图形中都是2pt。

问题出在你剪裁到一个矩形上,而你的图形边缘紧贴这个矩形的边缘,因此只有在矩形内部的边缘的一半被绘制。这就是为什么边缘只显示1像素宽度的原因。

解决方案要么是不剪裁,要么在各个轴上将剪裁矩形增大2pt,然后再进行剪裁,或者将图形的边缘向内移动1pt。 (估计时间:或者,是的,进行内部描边。)


有什么办法可以将描边放在路径内部而不是居中于路径上吗? - Gabe
@Gabe:你也可以这样做。https://dev59.com/iUzSa4cB1Zd3GeqPo7Q5#2488796 - Peter Hosey
我找到了另一种解决我的用例的方法(一个更简单的方法),但这肯定回答了问题。即使我去掉了剪辑,我仍然遇到了问题——但“中心描边”是问题所在:我的框架大小等于直边上路径的大小,因此外部像素永远不会被显示:它在框架之外。 - makdad
@phooze:这张图片明显出现了剪裁,所以如果即使你没有进行剪裁操作它也被剪裁了,那么这意味着框架已经为你剪裁了,因此你不需要再进行剪裁操作。(Mac OS X 绝对不会这样做,所以如果你删除剪裁并将此代码移植到 Cocoa,则要小心。) - Peter Hosey

2

如果有人试图做和我一样的事情(圆角化图片),请注意:

UIImageView类有一个CALayer类型的属性layer,而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];

也可以达到效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接