我正在以编程方式构建一个NSView层次结构,方法是将NSStackView放入NSScroller中。我以前也这么做过,我的代码是正确的。
视图层次结构是我所期望的,直到第一次通过runloop (或显示),在其中macOS Catalina (我认为Mojave)自动将一个NSVisualEffectView插入到视图层次结构中。这搞砸了我的定制画没有尽头。
我创建的层次结构是
NSScrollView -> NSStackView -> stack subviews这是在第一个显示循环之前的滚动视图“丰富”到:
NSScrollView -> NSClipView -> NSStackView -> stack subviews在第一次显示之后,NSVisualEffects视图将在与NSClipView相同的级别上添加:
NSScrollView -> NSClipView -> NSStackView -> stack subviews
-> NSVisualEffectsView有没有办法告诉滚动视图我不想要视觉效果视图?
任何帮助都将不胜感激!
发布于 2020-09-23 10:38:48
当我试图重现聚光灯窗时,我也面临着同样的问题。下面的屏幕截图显示了视觉效果视图中的表视图(包含在滚动视图中):

在旧版本的macOS中,这里的不透明背景是在滚动视图(或剪辑视图)上绘制的背景,我们可以通过设置清晰的背景色或按照卢卡斯的建议将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-02-27 21:15:47
非常肯定,您必须将drawsBackground设置为false。因此,对于NSScrollView的引用,您可以在视图加载后调用类似的内容,或者在xib/storyboard文件中分配这个值。
scrollView.drawsBackground = false发布于 2021-11-05 11:44:51
当在NSTableView或NSCollectionView中添加NSScrollView时,它的drawsBackground属性将被忽略,并添加NSVisualEffects视图,除非在表视图和集合视图中显式设置.backgroundColor = .clear。
因此,对于正确的行为:
tableView.backgroundColor = .clear
scrollView.drawsBackground = falsehttps://stackoverflow.com/questions/58813759
复制相似问题