删除 Big Sur 中的 NSTableView 浮动组行下划线

Remove NSTableView Floating Group Row Underline in Big Sur

我有 NSOutlineViews 以浮动组行作为标题。我的 headers 是 semi-transparent 所以滚动的内容只能在下面看到:

在大苏尔,headers 看起来像这样:

它们下面有一条下划线,并且所有透明度都被删除了 - 所以看起来好像在某处添加了背景。

我正在对 NSTableRowViewNSOutlineView 进行子类化以停止任何绘图:

override func draw(_ dirtyRect: NSRect) {}

我也在 NSTableRowView 上禁用 'Group Style':

override var isGroupRowStyle: Bool { get { false } set {} }

谁能告诉我线条和背景可能来自哪里?谢谢。

编辑

进一步调查显示背景和线条渲染是NSScrollView浮动内容视图(_NSScrollViewFloatingSubviewsContainerView)的一部分。似乎没有任何与此相关的选项。

我目前可以使用以下极端技巧来更改 NSTableView 中浮动 header 的背景并删除下划线:

extension YourViewController: NSTableViewDelegate {
    func tableView(_ tableView: NSTableView, didAdd rowView: NSTableRowView, forRow row: Int) {
        if row == 0, rowView.isGroupRowStyle {
            DispatchQueue.main.async {
                if let scroll = tableView.enclosingScrollView {
                    for sub in scroll.subviews {
                        if sub.className.contains("Float"),
                           let effect = sub.subviews.first?.subviews.first?.subviews.first as? NSVisualEffectView,
                           let line = sub.subviews.first?.subviews.first?.subviews.last {
                            effect.material = .menu
                            line.isHidden = true
                        }
                    }
                }
            }
        }
    }
}

添加第 0 行时,正在迭代表视图 .enclosingScrollView 的子视图(在给表视图一些时间以通过调用其余代码呈现浮动 header 之后async) 直到我们遇到我们想要更改的视图。

当然,这种代码是'bad practice'的一个例子,一旦Apple更改粘性header的实现,就会停止工作,但我不希望有什么由于所有特定条件而崩溃。

与此同时,提交反馈并请求调整 NSTableViewNSOutlineView 的浮动 header 可能是最好的主意。