J'essaie de changer la taille de la police de mon NSTableView dans mon code pour permettre à l'utilisateur de le changer à son goût. J'ai réussi à changer la taille de la police de chaque NSTableCellView, mais je n'ai pas réussi à le faire par les cellules d'en-tête.

J'essayais de le faire comme ça

let headerCell = NSTableHeaderCell()
let font = NSFont(name: "Arial", size: 22.0)
headerCell.stringValue = "firstname"
headerCell.font = font
customerTable.tableColumns[0].headerCell = headerCell

La valeur stringValue de la cellule d'en-tête sera définie en conséquence mais la taille ne change pas. Comment modifier la taille de la police de mes en-têtes?

Merci

Oliver

3
Oliver Koehler 20 avril 2017 à 08:06

3 réponses

Meilleure réponse

Vous pouvez créer une sous-classe NSTableHeaderCell et implémenter la propriété que vous souhaitez modifier.

En Objective-C (je ne suis pas bon en Swift):

@implementation CustomTableHeaderCell

-(NSFont *)font {
    return [NSFont fontWithName:@"Arial" size:22];
}

// you can alse custom textColor
-(NSColor *)textColor {
    return [NSColor redColor];
}

@end

Attribuer CustomTableHeaderCell:

CustomTableHeaderCell *headerCell = [[CustomTableHeaderCell alloc] init];
headerCell.stringValue = @"Header title";
self.tableView.tableColumns[0].headerCell = headerCell;

Screenshot

Dans Cocoa, il y a beaucoup de choses dont vous ne pouvez pas changer son style par cell.font = ..., vous devez créer des sous-critères.

1
tomfriwel 20 avril 2017 à 15:08

Donc, finalement, je n'ai pu résoudre ce problème qu'avec le sous-classement NSTableHeaderCell. C'était quelque peu étrange car Swift et Cocoa ont toujours tendance à privilégier la composition à l'héritage, mais de toute façon.

Swift 3.1

final class CustomTableHeaderCell : NSTableHeaderCell {

    override init(textCell: String) {
        super.init(textCell: textCell)
        self.font = NSFont.boldSystemFont(ofSize: 18) // Or set NSFont to your choice
        self.backgroundColor = NSColor.white
    }

    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func draw(withFrame cellFrame: NSRect, in controlView: NSView) {
        // skip super.drawWithFrame(), since that is what draws borders
        self.drawInterior(withFrame: cellFrame, in: controlView)
    }

    override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
        let titleRect = self.titleRect(forBounds: cellFrame)
        self.attributedStringValue.draw(in: titleRect)
    }
}
3
Oliver Koehler 21 avril 2017 à 19:10

La modification de la valeur attribuéeStringValue fera l'affaire

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.tableColumns.forEach { (column) in

        column.headerCell.attributedStringValue = NSAttributedString(string: column.title, attributes: [NSFontAttributeName: NSFont.boldSystemFont(ofSize: 18)])

        // Optional: you can change title color also jsut by adding NSForegroundColorAttributeName
    }
}

https://i.stack.imgur.com/IXJyu.png

1
Developer 24 janv. 2019 à 14:35