我想在AddressBook中创建一个类似于标签周围的圆形rect(在编辑时)。我试图使用带圆角矩形的bezierPath然后抚摸它来执行此操作。但是,最终结果没有非常平滑的边缘。
地址簿标签
地址簿标签放大了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半径作为圆形矩形 - 没有太大的成功。我将不胜感激。感谢
答案 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