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

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

出现的问题如下图所示: 该图展示了一个视图角落。圆角处理只部分成功,因为仍然存在一个白色角落伸出超出窗口的圆角。
如果有更好的设置窗口圆角的方法,我会接受这样的建议。我已经对此进行了大量研究,但是这个解决方案似乎是最简单的。
非常感谢任何关于如何解决此问题的建议。

给你的视图设置一个清晰的背景颜色。 - rmaddy
我该如何解决这个问题?NSColor.clearColor().set() 没有起到帮助作用... - Jonathan H.
抱歉,我在想iOS中UIViewbackgroundColor属性。我不确定NSView是否有类似的东西。 - rmaddy
1
这可能会帮助有人找到这个问题的答案。我注意到,如果将角半径增加到超过高度的一半,该问题就会消失。 - Luke Carbis
2个回答

3
您需要在NSWindow实例上执行以下操作:
[window setOpaque:NO];
[window setBackgroundColor:[NSColor clearColor]];

并且绘制所需的形状。

并查看此文章


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接