#nstableview #appkit #nsoutlineview #macos-big-sur
#nstableview #appkit #nsoutlineview #macos-биг-сур
Вопрос:
У меня есть NSOutlineView
s с плавающими групповыми строками в качестве заголовка. Мои заголовки полупрозрачны, поэтому прокручиваемый контент можно просто увидеть под ним:
В Биг-Суре заголовки выглядят следующим образом:
Под ними есть подчеркивание, и вся прозрачность удалена — так что это выглядит так, как будто где-то добавляется фон.
Я делаю подклассы 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. Спасибо, Эли. Я пометил это как правильное, потому что это, безусловно, отвечает на вопрос! Я не буду его отправлять, хотя 🙂