2015-06-20 100 views
3

在我的ViewController的主要NSView中,我重写了func drawRect(dirtyRect: NSRect)方法来在我的主视图上使用NSBezierPath实现圆角。 在同样的方法中,我也指定了我的主视图的渐变背景。在使用NSBezierPath的NSView上的圆角被严重绘制

override func drawRect(dirtyRect: NSRect) { 

    let path: NSBezierPath = NSBezierPath(roundedRect: self.bounds, xRadius: 18.0, yRadius: 18.0) 
    path.addClip() 

    let gradient = NSGradient(startingColor: NSColor(hexColorCode: "#383838"), endingColor: NSColor(hexColorCode: "#222222")) 
    gradient.drawInRect(self.frame, angle: 90) 
} 

即产生下列图像中示出的问题:

该图像显示的观点角中的一个。圆角的圆角只是部分成功,因为仍然有一个白色的角落伸出窗外的圆角。

如果有人有更好的方法来设置窗口的角半径,我会接受这样的建议。我已经做了大量的研究,但是这个解决方案似乎是最简单的。

有关如何解决此问题的任何建议,我们非常感谢。

+0

为您的视图提供清晰的背景色。 – rmaddy

+0

我该怎么办? 'NSColor.clearColor().set()'没有帮助... –

+0

对不起,我在考虑iOS中'UIView'的'backgroundColor'属性。我不确定是否有类似的'NSView'。 – rmaddy

回答

2

你应该做你的NSWindow实例如下:

[window setOpaque:NO]; 
[window setBackgroundColor:[NSColor clearColor]]; 

和借鉴需要的形状。

并检查this article

2

我找到了一个解决方案,通过使用一个子图层。

class StyledButton: NSView { 
    let roundLayer: CALayer = CALayer() 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 
     setup() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setup() 
    } 

    func setup() { 
     self.wantsLayer = true 
     self.layer?.addSublayer(roundLayer) 
     roundLayer.frame = self.bounds 
     roundLayer.cornerRadius = 3 
     roundLayer.backgroundColor = NSColor.redColor().CGColor 
    } 
}