我一直在尝试将 SwiftUI 用于一些原生 macOS 应用程序,但最初无法解决这个问题。如果您想从 SwiftUI 为您的 macOS 应用程序提供现代模糊的窗口背景,则没有内置的方法可以做到这一点(或者至少我可以找到,如果有,请告诉我!)。幸运的是,执行此操作的代码简短而简单。
首先,我们需要将视图的背景设置为 NSVisualEffectView
. 该类或等效类在 SwiftUI 中尚不可用,因此我们必须创建一个NSViewRepresentable
以将其公开给 SwiftUI:
1
2
3
4
5
6
7
8
9
10
struct VisualEffectView: NSViewRepresentable {
func makeNSView(context: Context) -> NSVisualEffectView {
let effectView = NSVisualEffectView()
effectView.state = .active
return effectView
}
func updateNSView(_ nsView: NSVisualEffectView, context: Context) {
}
}
一旦你有了它,你可以将它添加background到你窗口的主要内容视图中。不是必需的ignoresSafeArea()
,但如果您想使用全尺寸内容视图并让内容位于窗口标题栏下方,看起来会更好。
1
2
3
4
5
6
struct BlurredWindowContentView: View {
var body: some View {
content
.background(VisualEffectView().ignoresSafeArea())
}
}
这就是你需要做的。这是 macOS 12.3 的屏幕截图:
窗口模糊截图 SwiftUI 中 macOS 上的模糊窗口示例
如果你想要更多的配置VisualEffectView
,你可以向可表示的结构添加额外的属性来配置底层的 NSVisualEffectView
.