带圆角的 NSVisualEffectView

NSVisualEffectView with rounded corners

如何在 OS X 中显示带圆角的 NSVisualEffectView?

我添加 NSVisualEffectView 的代码:

let visualEffectView = NSVisualEffectView(frame: NSMakeRect(0, 0, 300, 300))
visualEffectView.material = NSVisualEffectMaterial.Dark
visualEffectView.blendingMode = NSVisualEffectBlendingMode.BehindWindow
self.addSubview(visualEffectView)

您可以通过将 wantsLayer 设置为 true 来为您的 NSVisualEffectView 启用层支持视图,然后设置支持层的 cornerRadius

    let visualEffectView = NSVisualEffectView(frame: NSMakeRect(0, 0, 300, 300))
    visualEffectView.material = NSVisualEffectMaterial.Dark
    visualEffectView.blendingMode = NSVisualEffectBlendingMode.BehindWindow
    visualEffectView.wantsLayer = true
    visualEffectView.layer?.cornerRadius = 15.0
    self.view.addSubview(visualEffectView)

这会产生带有漂亮圆角的效果视图:

NSVisualEffectView 有一个 maskImage 属性 可以用来将视图裁剪成任意形状。

来自header:

/* The mask image masks this view. It is best to set this to the
   smallest mask image possible and properly set the image.capInsets to
   inform the image on how to stretch the contents when it is used as a
   mask. Setting the maskImage on an NSVisualEffectView that is the
   window.contentView will correctly set the window's shadow.
 */
public var maskImage: NSImage?

例如,您可以使用带圆角的 NSImage,并将其 capInsets 设置为圆角半径,将其 resizingMode 设置为 .stretch

Swift 5.5

对于我的一个应用程序,我完全按照@sam 所说的去做。结果如下:

您需要做的事情:

  • 在 NSImage 上定义一个扩展:
<pre><code>extension NSImage { static func mask(withCornerRadius radius: CGFloat) -> NSImage { let image = NSImage(size: NSSize(width: radius * 2, height: radius * 2), flipped: false) { NSBezierPath(roundedRect: [=10=], xRadius: radius, yRadius: radius).fill() NSColor.black.set() return true } image.capInsets = NSEdgeInsets(top: radius, left: radius, bottom: radius, right: radius) image.resizingMode = .stretch return image } }
  • 创建视觉效果视图
<pre><code>private lazy var visualEffectView: NSVisualEffectView = { let visualEffectView = NSVisualEffectView() visualEffectView.blendingMode = .behindWindow visualEffectView.material = .popover visualEffectView.state = .active visualEffectView.maskImage = .mask(withCornerRadius: 25) return visualEffectView }()

编码愉快 ;)