【问题标题】:How can I use NSVisualEffectView to blend window with background如何使用 NSVisualEffectView 将窗口与背景混合
【发布时间】:2026-01-19 20:00:01
【问题描述】:

对于旧版本的 Swift/Xcode,似乎有很多问题,但由于某种原因,它并没有与最新的更新一起工作。我创建了一个 NSVisualEffectView、blurryView,并将子视图添加到我的主视图中:

class ViewController: NSViewController {
    @IBOutlet weak var blurryView: NSVisualEffectView! 
    override func viewDidLoad() {
        super.viewDidLoad()

        //background styling
        blurryView.wantsLayer = true
        blurryView.blendingMode = NSVisualEffectBlendingMode.behindWindow
        blurryView.material = NSVisualEffectMaterial.dark
        blurryView.state = NSVisualEffectState.active

        self.view.addSubview(blurryView, positioned: NSWindowOrderingMode.above, relativeTo: nil)

        // Do any additional setup after loading the view.
    }
...
}

但是当我运行它时,对窗口没有任何影响。 (当我将它设置在窗口内,并将其叠加在我的另一个视图之上时,模糊可以正常工作,但我只希望窗口模糊。)我也尝试在我的 App Delegate 类中做同样的事情,但我可以'不要将我的窗口连接为插座,因此无法将模糊视图添加到窗口。下面是代码的样子:

class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Insert code here to initialize your application

        blurryView.wantsLayer = true
        blurryView.blendingMode = NSVisualEffectBlendingMode.withinWindow
        blurryView.material = NSVisualEffectMaterial.dark
        blurryView.state = NSVisualEffectState.active

        self.window.contentView?.addSubview(blurryView)

    }
...
}

想知道我在寻找什么:NSVisualEffectView Vibrancy

【问题讨论】:

  • 你有 blurryView 作为@IBOutlet。那你为什么要在代码中配置它。您可以在界面生成器中使用所有选项。另外,为什么要手动将视图添加为子视图?
  • 你能贴一张你的故事板或xib文件的图片吗?
  • @mangerlahn gyazo.com/cd4ba905f733ac1040e9f2862b4d56b7。我在情节提要上找不到该选项,而其他人似乎就是这样添加它的。对于 swift 和 xcode 来说也相对较新,因此可能会遗漏一些非常明显的东西

标签: swift macos cocoa swift3


【解决方案1】:

很简单:

  1. 在 Interface Builder 中直接拖动 NSVisualEffectView 作为场景主视图的子视图。
  2. Properties Inspector 中将Blending Mode 设置为Behind Window
  3. 将您需要的其余视图添加为NSVisualEffectView 的子视图
  4. 就是这样,大功告成

这是一个例子:

Panel 1 View Controller 是我的模糊视图,Background View 是我的“真实”视图层次结构中的第一个(非模糊)视图。

【讨论】:

  • 这适用于其他项目,但由于某种原因,当我拖动一个新的 NSVisualEffectView 时,它只覆盖了它下面的所有视图,并且情节提要视图变得非常奇怪。 gyazo.com/af19501f682c3687cb4ca923c6b45ff6
【解决方案2】:

斯威夫特 5: 只需将其添加到您的 viewWillAppear 中,它应该可以工作:

override func viewWillAppear() {
    super.viewWillAppear()
    //Adds transparency to the app
    view.window?.isOpaque = false
    view.window?.alphaValue = 0.98 //you can remove this line but it adds a nice effect to it
    
    let blurView = NSVisualEffectView(frame: view.bounds)
    blurView.blendingMode = .behindWindow
    blurView.material = .fullScreenUI
    blurView.state = .active
    view.window?.contentView?.addSubview(blurView)
}

【讨论】: