NSVisualEffectView 未应用预期的“磨砂”效果

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

现代应用程序越来越多地使用典型的“磨砂”效果作为窗口背景。这种效果通常由模糊和背景活力的组合组成。据我所知,根据 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
    }
}

这将导致以下面板外观:

如您所见,没有磨砂外观 圆角半径应用于面板的内容视图。

这是为什么呢?我该如何解决这个问题,以便我的面板应用适当的磨砂效果?

swift macos appkit nspanel nsvisualeffectview
1个回答
0
投票

当使用一个没有在自己的

drawRect(_:)
中绘制“清晰”颜色的视图作为窗口的内容视图时,我已经看到了这种行为。您将获得窗口位图后备存储的粗黑框。

所以,我要尝试的第一件事是创建一个 NSHostingView 的子类,其中的

drawRect(_:)
填充颜色清晰,然后调用
super.drawRect(_:)
。查看情况并报告。

© www.soinside.com 2019 - 2024. All rights reserved.