带有圆角矩形的NSBezierPath没有平滑的角

时间:2015-10-17 21:32:45

标签: swift core-graphics

我想在AddressBook中创建一个类似于标签周围的圆形rect(在编辑时)。我试图使用带圆角矩形的bezierPath然后抚摸它来执行此操作。但是,最终结果没有非常平滑的边缘。

地址簿标签

AddressBook label

地址簿标签放大了pixie

AddressBook label zoomed in pixie

我的标签

My label

我的标签放大了精灵

My label zoomed in pixie

看起来地址簿版本中的曲线更加积极地混合到背景白色。在Pixie中,我光标所在的像素的sRGB值为(0.98,0.98,0.98),在我的版本中它是(0.86,0.86,0.86),导致一些锯齿状边缘。 我绘制rect的代码是

override func drawWithFrame(cellFrame: NSRect, inView controlView: NSView) {
    if let context = NSGraphicsContext.currentContext() {
        context.saveGraphicsState()
        let borderColor = NSColor.init(SRGBRed: 0.75, green: 0.75, blue: 0.75, alpha: 1)
        let outline = NSBezierPath.init(roundedRect: cellFrame, xRadius: 4, yRadius: 4)
        outline.lineWidth = 4
        borderColor.setStroke()
        outline.stroke()

        drawInteriorWithFrame(cellFrame, inView: controlView)
        context.restoreGraphicsState()
    }
}

我尝试过使用不同的合成类型,线宽和xy半径作为圆形矩形 - 没有太大的成功。我将不胜感激。感谢

1 个答案:

答案 0 :(得分:2)

我相信这篇文章here解释了这个问题。当我们描绘一个矩形时,Coregraphics会沿着我们提供的矩形边缘的中间绘制轮廓。如果矩形是1像素宽,那么一半的笔划线将位于矩形之外,而另一半将位于内侧。由于我们无法绘制半个像素,因此Coregraphics会混合两种颜色(在内部和外部)来绘制线条。因此,要绘制单个像素线,我们需要修改大纲rect

CGRect rectFor1PxStroke(CGRect rect) 
{
    return CGRectMake(rect.origin.x + 0.5, rect.origin.y + 0.5, rect.size.width - 1, rect.size.height - 1);
}  

参考文章中还提供了其他几个选项。但是,通过我的初步测试,上述解决方案似乎工作正常 - 同时将linewidth = 1和曲线的x-y半径设置为2