首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止macOS自动将NSVisualEffectView插入NSScrollView

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

Stack Overflow用户
提问于 2019-11-12 07:18:36
回答 3查看 534关注 0票数 4

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

视图层次结构是我所期望的,直到第一次通过runloop (或显示),在其中macOS Catalina (我认为Mojave)自动将一个NSVisualEffectView插入到视图层次结构中。这搞砸了我的定制画没有尽头。

我创建的层次结构是

代码语言:javascript
复制
NSScrollView -> NSStackView -> stack subviews

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

代码语言:javascript
复制
NSScrollView -> NSClipView -> NSStackView -> stack subviews

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

代码语言:javascript
复制
NSScrollView -> NSClipView          -> NSStackView -> stack subviews
             -> NSVisualEffectsView

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

任何帮助都将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-23 10:38:48

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

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

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

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

解决方案--

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

代码语言:javascript
复制
class ScrollView: NSScrollView {
    override func didAddSubview(_ subview: NSView) {
        super.didAddSubview(subview)

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

更新

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

代码语言:javascript
复制
// for macOS 11 Big Sur
tableView.style = .sourceList

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

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

票数 2
EN

Stack Overflow用户

发布于 2020-02-27 21:15:47

非常肯定,您必须将drawsBackground设置为false。因此,对于NSScrollView的引用,您可以在视图加载后调用类似的内容,或者在xib/storyboard文件中分配这个值。

代码语言:javascript
复制
scrollView.drawsBackground = false
票数 1
EN

Stack Overflow用户

发布于 2021-11-05 11:44:51

当在NSTableViewNSCollectionView中添加NSScrollView时,它的drawsBackground属性将被忽略,并添加NSVisualEffects视图,除非在表视图和集合视图中显式设置.backgroundColor = .clear

因此,对于正确的行为:

代码语言:javascript
复制
tableView.backgroundColor = .clear
scrollView.drawsBackground = false
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58813759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档