2016-09-16 6 views
0

MacOS 10.12+, Xcode 8+, Swift 3:Как настроить заголовок NSTableView на macOS 10.12+?

Я хотел бы программно настроить шрифт и рисунок заголовка 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 рисует "в консоли, но шрифт заголовка таблицы не изменяется.

+1

Вы пытались установить атрибут 'attribatedStringValue'? – Willeke

+0

@Willeke Да, я пробовал настройку атрибутаStringValue. Мои настройки были проигнорированы. – sam

+1

@sam В моей реализации MyHeaderCell с использованием 'attribitedStringValue' работает отлично! Поэтому я думаю, что что-то не так с вашим кодом. Вы можете найти некоторые подсказки [здесь] (http://stackoverflow.com/questions/32666795/how-do-i-override-layout-of-nstableheaderview) –

ответ

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) 
    } 
}