4

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

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

我创建的层次结构是

NSScrollView -> NSStackView -> stack subviews

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

NSScrollView -> NSClipView -> NSStackView -> stack subviews

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

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

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

任何帮助,将不胜感激!

4

3 回答 3

2

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

在此处输入图像描述

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

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

于 2020-09-23T10:38:48.377 回答
1

很确定你必须设置drawsBackgroundfalse. 因此,通过引用 NSScrollView,您可以在加载视图后调用类似这样的内容,或者在 xib/storyboard 文件中分配此值。

scrollView.drawsBackground = false
于 2020-02-27T21:15:47.473 回答
0

当您在其中添加一个NSTableViewor时NSCollectionViewNSScrollView它的drawsBackground属性将被忽略并NSVisualEffects添加一个视图,除非您.backgroundColor = .clear在内部的 table view 和 collectionview 上显式设置。

所以为了正确的行为:

tableView.backgroundColor = .clear
scrollView.drawsBackground = false
于 2021-11-05T11:44:51.657 回答