NSBezierPath圆角矩形的拐角不太好。

9

我有一个NSBezierPath,用于绘制圆角矩形,但是在全尺寸查看时,它的边角看起来很粗糙,并且比其余部分更亮。我的代码如下:

 NSBezierPath *path = [NSBezierPath bezierPath];
    [path appendBezierPathWithRoundedRect:NSMakeRect(0, 0, [self bounds].size.width, [self bounds].size.height) xRadius:5 yRadius:5];

    NSGradient *fill = [[NSGradient alloc] initWithColorsAndLocations:[NSColor colorWithCalibratedRed:0.247 green:0.251 blue:0.267 alpha:0.6],0.0,[NSColor colorWithCalibratedRed:0.227 green:0.227 blue:0.239 alpha:0.6],0.5,[NSColor colorWithCalibratedRed:0.180 green:0.188 blue:0.196 alpha:0.6],0.5,[NSColor colorWithCalibratedRed:0.137 green:0.137 blue:0.157 alpha:0.6],1.0, nil];
    [fill drawInBezierPath:path angle:-90.0];

    [[NSColor lightGrayColor] set];
    [path stroke];

这是两个角的图片(小图中不太明显): corners 有人知道这是什么原因吗?还是我漏了什么?
感谢任何帮助。
2个回答

19

圆角矩形的直线正好位于视图的边界上,因此每条线的一半宽度都被剪切掉了。(就像它们在子像素上一样。)

试着做出改变。

NSMakeRect(0, 0, [self bounds].size.width, [self bounds].size.height)

NSMakeRect(0.5, 0.5, [self bounds].size.width - 1, [self bounds].size.height - 1)

如果一个NSBezierPath看起来有些奇怪或模糊,尝试将其移动半个像素。


2
与其将其移动半个像素,通常更好的做法是将路径的描边宽度减半并向内缩进绘图,这正是您的代码在此处实际执行的操作。 - Jon Hess
6
更短的方法:NSInsetRect(self.bounds,0.5,0.5)。该代码的作用是在视图的边界内部创建一个缩小了0.5个点的矩形。 - sergeyne

0
看一下NSBezierPath文档中的setFlatness:方法。它控制渲染曲线的平滑程度。我相信把它设置成一个更小的数字(默认为.6)会产生更加平滑的曲线,但需要更多计算量(虽然对于简单路径来说,我认为影响不大)。

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