Как настроить заголовок 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, который не требует создания подклассов.

  1. в начале func tableView(_ myTable: NSTableView... добавьте следующие строки кода:

             tableColumn?.headerCell.drawsBackground = true
     tableColumn?.headerCell.backgroundColor = fill1Tint 
    

Этот код меняет цвет фона headerCell (а fill1Tint - это какой-то NSColor).

Затем добавьте:

          let paragraphStyle: NSMutableParagraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = NSTextAlignment.center
  1. в каждом блоке 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])
    

Этот код позволяет использовать как другой фон, так и центрированный текст с атрибутами.

Другие вопросы по тегам