【问题标题】:NSBezierPath rounded rectangle has bad cornersNSBezierPath 圆角矩形有坏角
【发布时间】:2011-04-20 08:21:15
【问题描述】:

我有一个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];

这是两个角的图片(在小图片中不那么明显):

有人知道这是什么原因吗?我只是错过了什么吗?

感谢您的帮助

【问题讨论】:

    标签: cocoa stroke nsbezierpath


    【解决方案1】:

    roundrect 的直线正好在视图的边界上,因此每条线的一半宽度被截断。 (就好像它们在子像素上一样。)

    尝试改变

    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 看起来有点奇怪或模糊,请尝试将其移动半个像素。

    【讨论】:

    • 与其将其移动半个像素,不如将绘图插入路径笔划宽度的一半,这就是您的代码在此处实际执行的操作。跨度>
    • 较短的方式:NSInsetRect(self.bounds, 0.5, 0.5)
    【解决方案2】:

    查看NSBezierPath 文档中的setFlatness: 方法。它控制渲染曲线的平滑程度。我相信将其设置为较小的数字(默认值为 .6)会产生更平滑的曲线,但代价是更多的计算(尽管对于简单的路径,我怀疑它是否很重要)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多