Удалить подчеркивание строки плавающей группы NSTableView в Big Sur

#nstableview #appkit #nsoutlineview #macos-big-sur

#nstableview #appkit #nsoutlineview #macos-биг-сур

Вопрос:

У меня есть NSOutlineView s с плавающими групповыми строками в качестве заголовка. Мои заголовки полупрозрачны, поэтому прокручиваемый контент можно просто увидеть под ним:Заголовок в Catalina

В Биг-Суре заголовки выглядят следующим образом:

введите описание изображения здесь

Под ними есть подчеркивание, и вся прозрачность удалена — так что это выглядит так, как будто где-то добавляется фон.

Я делаю подклассы NSTableRowView и NSOutlineView останавливаю любой рисунок:

 override func draw(_ dirtyRect: NSRect) {}
 

Я тоже отключаю «Стиль группы» NSTableRowView :

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

Кто-нибудь может сказать мне, откуда может исходить линия и фон? Спасибо.

Редактировать

Дальнейшее исследование показывает, что рендеринг фона и строк является частью плавающего представления содержимого NSScrollView (_NSScrollViewFloatingSubviewsContainerView). Похоже, с этим не связано никаких вариантов.

Ответ №1:

В настоящее время для меня работает следующий экстремальный хак, чтобы изменить фон плавающего заголовка в a NSTableView и удалить подчеркивание:

 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 tableview (после предоставления tableview некоторого времени для отображения плавающего заголовка путем асинхронного вызова остальной части кода), пока мы не столкнемся с представлениями, которые мы хотим изменить.

Конечно, такой код является примером «плохой практики» и перестанет работать, как только Apple изменит реализацию липкого заголовка, но я не ожидаю, что что-либо произойдет сбой из-за всех конкретных условий.

В то же время, вероятно, лучшей идеей будет отправить отзыв с просьбой сделать плавающий заголовок NSTableView и NSOutlineView регулируемым.

Комментарии:

1. Спасибо, Эли. Я пометил это как правильное, потому что это, безусловно, отвечает на вопрос! Я не буду его отправлять, хотя 🙂