13

我想在 NSImage 上做一个圆角矩形轮廓,我认为使用 NSBezierPath 是最好的方法。但是,我遇到了一个问题:我没有画出漂亮的曲线,而是得到了这个:

在此处输入图像描述

由于我无法理解的原因,NSBezierPath 绘制的圆形部分颜色比其他部分更深。

这是我正在使用的代码(在 drawRect: 自定义视图上调用):

NSBezierPath* bp = [NSBezierPath bezierPathWithRoundedRect: self.bounds xRadius: 5 yRadius: 5];
[[[NSColor blackColor] colorWithAlphaComponent: 0.5] setStroke];
[bp stroke];

有任何想法吗?

编辑:

如果我将路径插入 0.5,一切都很好。但是为什么当我将路径偏移 10 个像素时会得到这个(例如)?

在此处输入图像描述

如果我理解正确,它也应该画一条细线......

4

2 回答 2

56

许多渲染系统都源自 PostScript 绘图模型。Core Graphics 就是这些衍生系统之一。(这里有一些其他的:PDF、SVGHTML Canvas 2D 上下文Cairo。)

所有这些系统的想法都是用一条固定宽度的线划出一条路径。当您描边路径时,线横跨路径:线宽的一半在路径的一侧,线宽的一半在另一侧。这是一张图表,可以使这一点更清楚:

路径行程

现在,当您描画一条位于视图边界的路径时会发生什么?一半的笔划将超出您的视图范围并被剪掉 - 未绘制。您只会看到落在视图边界内的笔划的一半。

当您使用圆角时,该角会从视图的边界向其中心拉开,因此角周围的更多笔划落在视图的边界内。因此,笔触似乎在圆角处变粗,如下所示:

路径行程被剪裁

要解决此问题,您需要将路径插入线宽的一半,以便整个笔划沿整个路径落在视图边界内。默认线宽为 1.0,因此:

NSBezierPath* bp = [NSBezierPath bezierPathWithRoundedRect:
    NSRectInset(self.bounds, 0.5, 0.5) xRadius:5 yRadius:5];
于 2012-12-02T22:10:30.513 回答
0

在 iOS 字段中,只需减去圆的半径即可,以防止被剪裁。

UIBezierPath *roundPath = [UIBezierPath bezierPath];
[roundPath addArcWithCenter:
CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2)
 radius:(self.frame.size.width / 2 - 0.5) 
startAngle:M_PI_2 endAngle:M_PI * 3 / 2.f clockwise:YES];
于 2019-03-13T02:25:00.367 回答