2015-10-17 137 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'。 –