如何防止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,因此一切看起来都是错误的。我在那里添加它的代码可能对删除它有用。