如何使用NSVisualEffectView将窗口与背景混合

3 macos cocoa swift swift3

对于旧版本的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.
    }
...
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,窗口没有任何影响.(当我将它设置在窗口内,并将其叠加在我的另一个视图之上时,模糊工作正常,但我只希望窗口模糊.)我也尝试在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)

    }
...
}
Run Code Online (Sandbox Code Playgroud)

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

AD *_*ess 6

Swift 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)
}
Run Code Online (Sandbox Code Playgroud)


Bog*_*rca 5

它非常简单:

  1. 在Interface Builder中,NSVisualEffectView直接将a拖动为场景主视图的子视图.
  2. Properties Inspector设置Blending ModeBehind Window
  3. 添加您需要的其余视图作为子视图 NSVisualEffectView
  4. 就是这样,你已经完成了

这是一个例子:

在此输入图像描述

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