2015-10-17 120 views
0

我想创建一个类似于AddressBook中标签(在编辑时)周围的圆角矩形。我试图用一个四舍五入的bezierPath,然后抚摸它来做到这一点。但是,最终的结果并不是非常平滑的边缘。带圆角矩形的NSBezierPath没有光滑的边角

通讯簿标签

AddressBook label

通讯簿标签中的精灵放大

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),导致一些锯齿边缘。 我的代码绘制矩形是

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半径玩耍 - 但没有成功。我希望对此有一些指导。谢谢

+0

[NSBezierPath drawing]的可能重复(http://stackoverflow.com/questions/13674118/nsbezierpath-drawing) –

回答

2

我相信这篇文章here解释了这个问题。当我们敲击矩形时,Coregraphics会沿着我们提供的矩形边缘的中间绘制轮廓。如果矩形宽度为1像素,那么一半的冲程线将位于矩形外部,而另一半则位于内部。由于我们无法画出半个像素,Coregraphics将这两种颜色(内部和外部)混合绘制出线条。因此,绘制单个像素线,我们需要修改轮廓矩形

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和xy半径设置为2

+0

您可能想要查看'CGRectInset'。 –