/ / Comment personnaliser l'en-tête NSTableView sur macOS 10.12+? - macos, cacao, nstableview, swift3, nstableheadercell

Comment personnaliser l'en-tête NSTableView sur macOS 10.12+? - macos, cacao, nstableview, swift3, nstableheadercell

MacOS 10.12+, Xcode 8+, Swift 3:

Je souhaite personnaliser par programme la police et le dessin d’un en-tête NSTableView. Je sais qu’il ya des questions plus anciennes à ce sujet, mais je n’ai rien trouvé qui puisse fonctionner aujourd’hui.

Par exemple, j'ai essayé de sous-classer NSTableHeaderCell pour définir une police personnalisée:

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

Et puis utilisez cette sous-classe dans ma vue de table:

tableColumn.headerCell = MyHeaderCell()

Je vois le message "MyHeaderCell dessine" dans la console, mais la police de l'en-tête de la table ne change pas.

Réponses:

2 pour la réponse № 1

Merci aux commentaires de @HeinrichGiesen et@ Willeke, je l'ai fait fonctionner. Je l’affiche ici au cas où cela aiderait une personne en aval. Notez que ma façon de personnaliser la couleur d’arrière-plan n’est pas si flexible. Je ne fais que colorer le dessin par défaut. Il convient assez bien à mes fins.

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