Как настроить заголовок NSTableView в macOS 10.12+?
MacOS 10.12+, Xcode 8+, Swift 3:
Я хотел бы программно настроить шрифт и рисунок заголовка NSTableView. Я знаю, что есть старые вопросы по этому поводу, но я не смог найти ничего, что работает сегодня.
Например, я попытался создать подкласс NSTableHeaderCell для установки собственного шрифта:
class MyHeaderCell: NSTableHeaderCell {
override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
NSLog("MyHeaderCell is drawing")
font = NSFont.boldSystemFont(ofSize: 12)
super.drawInterior(withFrame: cellFrame, in: controlView)
}
}
И затем используйте этот подкласс в моем табличном представлении:
tableColumn.headerCell = MyHeaderCell()
Я вижу сообщение "MyHeaderCell рисует" в консоли, но шрифт заголовка таблицы не меняется.
2 ответа
Благодаря комментариям @HeinrichGiesen и @Willeke, я все заработал. Я публикую это здесь на случай, если это поможет кому-то в дальнейшем. Обратите внимание, что мой способ настройки цвета фона не такой гибкий. Я действительно просто подкрашиваю чертеж по умолчанию. Это достаточно хорошо для моих целей.
final class MyHeaderCell: NSTableHeaderCell {
// Customize background tint for header cell
override func draw(withFrame cellFrame: NSRect, in controlView: NSView) {
super.draw(withFrame: cellFrame, in: controlView)
NSColor(red: 0.9, green: 0.9, blue: 0.8, alpha: 0.2).set()
NSRectFillUsingOperation(cellFrame, .sourceOver)
}
// Customize text style/positioning for header cell
override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
attributedStringValue = NSAttributedString(string: stringValue, attributes: [
NSFontAttributeName: NSFont.systemFont(ofSize: 11, weight: NSFontWeightSemibold),
NSForegroundColorAttributeName: NSColor(white: 0.4, alpha: 1),
])
let offsetFrame = NSOffsetRect(drawingRect(forBounds: cellFrame), 4, 0)
super.drawInterior(withFrame: offsetFrame, in: controlView)
}
}
Прошло некоторое время с тех пор, как кто-то задавал этот вопрос. Я столкнулся с той же очень неприятной проблемой при использовании Swift 5 и Xcode 12. Вот что я узнал, используя подход nstableview, который не требует создания подклассов.
в начале func tableView(_ myTable: NSTableView... добавьте следующие строки кода:
tableColumn?.headerCell.drawsBackground = true tableColumn?.headerCell.backgroundColor = fill1Tint
Этот код меняет цвет фона headerCell (а fill1Tint - это какой-то NSColor).
Затем добавьте:
let paragraphStyle: NSMutableParagraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.center
в каждом блоке tableColumn.identifier добавьте текстовую строку с атрибутами, например:
let title: String = "Value" tableColumn?.headerCell.attributedStringValue = NSAttributedString(string: title, attributes: [ NSAttributedString.Key.font: fontMedium, NSAttributedString.Key.foregroundColor: text1Tint, NSAttributedString.Key.paragraphStyle : paragraphStyle])
Этот код позволяет использовать как другой фон, так и центрированный текст с атрибутами.