NSBezierPath绘图

Ale*_*lex 11 cocoa drawing objective-c nsbezierpath

我想在NSImage上做一个圆角矩形轮廓,我想使用NSBezierPath是最好的方法.然而,我遇到了一个问题:我得到了这个:而不是绘制一条漂亮的曲线:

在此输入图像描述

由于我无法理解的原因,NSBezierPath正在绘制比其余部分颜色更深的圆角部分.

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

NSBezierPath* bp = [NSBezierPath bezierPathWithRoundedRect: self.bounds xRadius: 5 yRadius: 5];
[[[NSColor blackColor] colorWithAlphaComponent: 0.5] setStroke];
[bp stroke];
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑:

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

在此输入图像描述

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

rob*_*off 53

许多渲染系统都是从PostScript绘图模型派生的.Core Graphics是这些衍生系统之一.(以下是其他一些:PDF,SVG,HTML Canvas 2D Context,Cairo.)

所有这些系统都有想法用一些固定宽度的线条来描边.当你划过路径时,线条横跨路径:线条宽度的一半位于路径的一侧,而线条宽度的一半位于另一侧.这是一个可以使这个更清晰的图表:

路径中风

现在,当您描绘沿着视图边界的路径时会发生什么?一半的笔划将落在视图的边界之外并被剪掉 - 不会被绘制.您将只看到落在视图边界内的笔划的一半.

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

剪辑路径

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

NSBezierPath* bp = [NSBezierPath bezierPathWithRoundedRect:
    NSRectInset(self.bounds, 0.5, 0.5) xRadius:5 yRadius:5];
Run Code Online (Sandbox Code Playgroud)

  • 1,000,000小时,你是唯一一个能够引起我注意的人"中风的一半会落在你视线的范围之外并被剪掉 - 没有被画出来"没有其他人明确说明这一点而且我太愚蠢了在我知道中风跨越路径之后的连接,将是+100,但我限于1 (2认同)