使用NSBezierPath的NSView上的圆角被严重绘制

时间:2015-06-20 03:56:53

标签: macos swift nsview

在我的ViewController的主要NSView中,我使用func drawRect(dirtyRect: NSRect)覆盖NSBezierPath方法以在我的主视图上实现圆角。 在同样的方法中,我还指定了我的主视图的渐变背景。

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)
}

出现的问题如下图所示:

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

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

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

2 个答案:

答案 0 :(得分:2)

您应该在NSWindow实例上执行以下操作:

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

并绘制所需的形状。

然后检查this article

答案 1 :(得分:2)

我通过使用Sublayer找到了解决方案。

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
    }
}