首页 > 解决方案 > 如何防止 macOS 自动将 NSVisualEffectView 插入 NSScrollView

问题描述

NSView通过将 aNSStackView放入NSScroller. 我以前做过,我的代码是正确的。

视图层次结构是我所期望的,直到第一次通过运行循环(或显示),其中 macOS Catalina(我认为是 Mojave)自动将 aNSVisualEffectView插入到视图层次结构中。这弄乱了我的自定义绘图无止境..

我创建的层次结构是

NSScrollView -> NSStackView -> stack subviews

这是在第一个显示循环之前由滚动视图“丰富”的:

NSScrollView -> NSClipView -> NSStackView -> stack subviews

并在第一次显示后,将 NSVisualEffects 视图添加到与 NSClipView 相同的级别:

NSScrollView -> NSClipView          -> NSStackView -> stack subviews
             -> NSVisualEffectsView

有没有办法告诉滚动视图我不想要视觉效果视图?

任何帮助,将不胜感激!

标签: macoscocoaappkitnsscrollviewnsvisualeffectview

解决方案


当我尝试重新创建聚光灯窗口时,我遇到了同样的问题。下面的屏幕截图显示了视觉效果视图中的表格视图(包含在滚动视图中):

在此处输入图像描述

在旧版本的 macOS 中,这里的不透明背景是在滚动视图(或剪辑视图)上绘制的背景,我们可以通过设置清晰的背景颜色或按照 Lucas 的建议设置drawBackground来简单地将其删除。false

但是,由于在较新版本的 macOS(可能是 Catalina?)中插入了此视觉效果视图,这将不起作用:

在此处输入图像描述

它有一个不透明的内容背景材料,我没有找到任何与此行为相关的 API 或文档。


解决方法

对我有用的是在我的NSScrollView子类中隐藏插入的视觉效果视图:

class ScrollView: NSScrollView {
    override func didAddSubview(_ subview: NSView) {
        super.didAddSubview(subview)

        if subview is NSVisualEffectView {
            subview.isHidden = true
        }
    }
}

在此处输入图像描述


更新

如果您使用的是NSTableView,而不是上面的“hack”,最好将表格视图的样式设置为源列表:

// for macOS 11 Big Sur
tableView.style = .sourceList

// for macOS 10.15 Catalina and older
tableView.selectionHighlightStyle = .sourceList

当您这样做时,系统会自动为源列表外观(或侧边栏)配置滚动视图和表格视图。更具体地说,滚动视图不插入视觉效果视图,表格视图的行视图是半透明的。


推荐阅读