使用 NSBezierPath 的 NSView 上的圆角绘制得很糟糕

rounded corners on NSView using NSBezierPath are drawn badly

在我的 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)
}

出现的问题如下图所示:

图片显示了其中一个视角。圆角处理只取得了部分成功,因为仍然有一个白角伸出 window 的圆角之外。

如果有人有更好的方法来设置 window 的角半径,我会接受这样的建议。我对这个问题做了很多研究,但是这个解决方案似乎是最简单的。

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

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

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

并画出需要的形状。

并检查 this article

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

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