/ / Jak zmienić rozmiar czcionki NSTableHeaderCell - swift, cocoa, czcionki, rozmiar, nstableview

Jak zmienić rozmiar czcionki NSTableHeaderCell - swift, cocoa, czcionki, rozmiar, nstableview

Próbuję zmienić rozmiar czcionki mojegoNSTableView w moim kodzie, aby umożliwić użytkownikowi zmianę go do własnych upodobań. Udało mi się zmienić rozmiar czcionki każdego NSTableCellView, ale nie udało się tego zrobić za pomocą komórek nagłówka.

Próbowałem to zrobić w ten sposób

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

StringValue komórki nagłówka zostanie odpowiednio ustawiony, ale rozmiar się nie zmieni. Jak mogę zmienić rozmiar czcionki moich nagłówków?

Dzięki

Oliver

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz utworzyć NSTableHeaderCell podklasa i zaimplementuj właściwość, którą chcesz zmienić.

W Objective-C (nie jestem dobry w Swift):

@implementation CustomTableHeaderCell

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

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

@end

Przydzielać CustomTableHeaderCell:

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

Zrzut ekranu

W Cocoa jest wiele rzeczy, których nie możesz zmienić cell.font = ..., musisz utworzyć podkategorię.


2 dla odpowiedzi nr 2

Tak więc w końcu udało mi się rozwiązać ten problem tylko dzięki subklasowaniu NSTableHeaderCell. To było jakoś dziwne, ponieważ Swift i Cocoa zawsze preferują kompozycję niż dziedziczenie, ale i tak.

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