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

问题描述 投票:0回答:2

旧版本的 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

swift macos cocoa swift3
2个回答
10
投票

它的工作原理非常简单:

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

这是一个例子:

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


6
投票

斯威夫特 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)
}
© www.soinside.com 2019 - 2024. All rights reserved.