【问题标题】:rounded corners on NSView using NSBezierPath are drawn badly使用 NSBezierPath 的 NSView 上的圆角绘制得很糟糕
【发布时间】:2015-06-20 03:56:52
【问题描述】:

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

出现的问题如下图所示:

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

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

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

【问题讨论】:

  • 为您的视图提供清晰的背景色。
  • 我该怎么做呢? NSColor.clearColor().set() 没有帮助...
  • 抱歉,我想到了 iOS 中 UIViewbackgroundColor 属性。我不确定NSView 是否有类似的东西。
  • 这可能会帮助某人找到这个问题的答案。我注意到,如果您将拐角半径增加到一半以上,问题就会消失。

标签: macos swift nsview


【解决方案1】:

您应该在您的 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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多