【问题标题】:How to prevent macOS from inserting an NSVisualEffectView into an NSScrollView automatically如何防止 macOS 自动将 NSVisualEffectView 插入 NSScrollView
【发布时间】:2019-11-12 07:18:36
【问题描述】:

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

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

我创建的层次结构是

NSScrollView -> NSStackView -> stack subviews

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

NSScrollView -> NSClipView -> NSStackView -> stack subviews

在第一次显示之后,NSVisualEffects View 被添加到与 NSClipView 相同的级别:

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

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

任何帮助将不胜感激!

【问题讨论】:

  • 这类似于problem with NSPredicateEditor in a sheet,但在这种情况下,Apple没有插入 VEV,结果一切看起来都是错误的。我在那里添加它的代码可能对删除它很有用。

标签: macos cocoa appkit nsscrollview nsvisualeffectview


【解决方案1】:

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

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

但是,由于在较新版本的 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

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

【讨论】:

    【解决方案2】:

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

    scrollView.drawsBackground = false
    

    【讨论】:

      【解决方案3】:

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

      所以为了正确的行为:

      tableView.backgroundColor = .clear
      scrollView.drawsBackground = false
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        • 2011-08-20
        相关资源
        最近更新 更多