现代应用程序越来越多地使用典型的“磨砂”效果作为窗口背景。这种效果通常由模糊和背景活力的组合组成。据我所知,根据 Apple 的文档,这是使用
NSVisualEffectView
完成的。
我正在尝试遵循此 GitHub 存储库 中的示例(具体来说:示例 6)。下面的代码显示了我使用
NSPanel
的 NSVisualEffectView
实现,它似乎对面板的外观没有 任何 影响。
public class MyCustomPanel: NSPanel {
public init() {
super.init(contentRect: NSRect(origin: NSPoint(x: 200, y: 200), size: .zero), styleMask: [.fullSizeContentView, .nonactivatingPanel], backing: .buffered, defer: false)
self.isFloatingPanel = true
self.level = .floating
self.worksWhenModal = true
self.hidesOnDeactivate = false
self.titleVisibility = .hidden
self.backgroundColor = .clear
self.isMovableByWindowBackground = true
self.titlebarAppearsTransparent = true
self.animationBehavior = .utilityWindow
self.contentView = NSHostingView(rootView: MyCustomSwiftUIView())
self.isOpaque = true
self.backgroundColor = .gray
let visualEffect = NSVisualEffectView() // doesn't seem to have any effect
visualEffect.translatesAutoresizingMaskIntoConstraints = false
visualEffect.material = .windowBackground
visualEffect.blendingMode = .behindWindow
visualEffect.state = .active
visualEffect.wantsLayer = true
visualEffect.layer?.cornerRadius = 16.0
self.titleVisibility = .hidden
self.styleMask.remove(.titled)
self.isMovableByWindowBackground = true
self.contentView?.addSubview(visualEffect)
guard let constraints = self.contentView else {
return
}
visualEffect.leadingAnchor.constraint(equalTo: constraints.leadingAnchor).isActive = true
visualEffect.trailingAnchor.constraint(equalTo: constraints.trailingAnchor).isActive = true
visualEffect.topAnchor.constraint(equalTo: constraints.topAnchor).isActive = true
visualEffect.bottomAnchor.constraint(equalTo: constraints.bottomAnchor).isActive = true
}
}
这将导致以下面板外观:
如您所见,没有磨砂外观 或 圆角半径应用于面板的内容视图。
这是为什么呢?我该如何解决这个问题,以便我的面板应用适当的磨砂效果?
当使用一个没有在自己的
drawRect(_:)
中绘制“清晰”颜色的视图作为窗口的内容视图时,我已经看到了这种行为。您将获得窗口位图后备存储的粗黑框。
所以,我要尝试的第一件事是创建一个 NSHostingView 的子类,其中的
drawRect(_:)
填充颜色清晰,然后调用 super.drawRect(_:)
。查看情况并报告。