如何防止macOS自动将NSVisualEffectView插入NSScrollView

如何防止macOS自动将NSVisualEffectView插入NSScrollView,macos,cocoa,appkit,nsscrollview,nsvisualeffectview,Macos,Cocoa,Appkit,Nsscrollview,Nsvisualeffectview,通过将NSStackView放入NSScroller中,我以编程方式构建了一个NSView层次结构。我以前做过,我的代码是正确的 在macOS Catalina(我认为还有Mojave)第一次通过runloop(或display)自动将NSVisualEffectView插入视图层次结构之前,视图层次结构一直是我所期望的。这把我的自定义图纸搞砸了 我创建的层次结构是 NSScrollView -> NSStackView -> stack subviews 第一个显示循环之前的滚动

通过将
NSStackView
放入
NSScroller
中,我以编程方式构建了一个
NSView
层次结构。我以前做过,我的代码是正确的

在macOS Catalina(我认为还有Mojave)第一次通过runloop(或display)自动将
NSVisualEffectView
插入视图层次结构之前,视图层次结构一直是我所期望的。这把我的自定义图纸搞砸了

我创建的层次结构是

NSScrollView -> NSStackView -> stack subviews
第一个显示循环之前的滚动视图“丰富”了这一点:

NSScrollView -> NSClipView -> NSStackView -> stack subviews
第一次显示后,NSVisualEffects视图将添加到与NSClipView相同的级别:

NSScrollView -> NSClipView          -> NSStackView -> stack subviews
             -> NSVisualEffectsView
有没有办法告诉滚动视图我不想要视觉效果视图


任何帮助都将不胜感激

非常确定您必须将
drawsBackground
设置为
false
。因此,对于NSScrollView的引用,您可以在加载视图后调用类似的函数,或者在xib/storyboard文件中指定该值

scrollView.drawsBackground=false

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

在旧版本的macOS中,此处的不透明背景是在滚动视图(或剪辑视图)上绘制的背景,我们可以通过设置清晰的背景颜色,或按照Lucas的建议将
trackground
设置为
false
来移除它

但是,由于在较新版本的macOS(可能是Catalina?)中插入了此视觉效果视图,因此无法实现:

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


解决方法

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

class ScrollView:NSScrollView{
重写func didAddSubview(u子视图:NSView){
super.didAddSubview(子视图)
如果子视图为NSVisualEffectView{
subview.ishiden=true
}
}
}


更新

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

//适用于macOS 11 Big Sur
tableView.style=.sourceList
//适用于macOS 10.15 Catalina及以上版本
tableView.selectionHighlightStyle=.sourceList
执行此操作时,系统会自动配置源列表外观(或侧栏)的滚动视图和表视图。更具体地说,滚动视图不插入视觉效果视图,而表格视图的行视图是半透明的。

这与类似,但在这种情况下,苹果没有插入VEV,因此一切看起来都是错误的。我在那里添加它的代码可能对删除它有用。