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 № 1Moż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;
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)
}
}