我想在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个像素(例如)时,为什么我得到这个?
如果我理解正确,它也应该画一条细线......
答案 0 :(得分:51)
许多渲染系统都是从PostScript绘图模型派生的。 Core Graphics是这些衍生系统之一。 (以下是其他一些内容:PDF,SVG,the HTML Canvas 2D Context,Cairo。)
所有这些系统都想要用一些固定宽度的线条来描边。当你描绘路径时,跨越路径:线路宽度的一半位于路径的一侧,而线路宽度的一半位于另一侧。这是一个可以使这个更清晰的图表:
现在,当你描绘一个位于视图边界的路径时会发生什么?一半的笔划将落在视图的边界之外并被剪掉 - 不会被绘制。您将只看到落在视图边界内的笔划的一半。
当您使用圆角时,该角落会从视图的边界向其中心拉开,因此角落周围的更多笔划会落入视图的边界内。因此,笔划似乎在圆角处变厚,如下所示:
要解决此问题,您需要将路径插入线宽的一半,以便整个笔划沿着整个路径落入视图的边界内。默认线宽为1.0,因此:
NSBezierPath* bp = [NSBezierPath bezierPathWithRoundedRect:
NSRectInset(self.bounds, 0.5, 0.5) xRadius:5 yRadius:5];