如何更改NSTableHeaderCell的字体大小

5

我正在尝试在我的代码中更改NSTableView的字体大小,以允许用户根据自己的喜好进行更改。 我成功地通过更改每个NSTableCellView的字体大小来实现了这一点,但未能做到对标题单元格执行相同操作。

我曾尝试像这样做:

let headerCell = NSTableHeaderCell()
let font = NSFont(name: "Arial", size: 22.0)
headerCell.stringValue = "firstname"
headerCell.font = font
customerTable.tableColumns[0].headerCell = headerCell
表头单元格的stringValue会相应地设置,但其大小不会改变。如何改变我的表头字体大小?

谢谢

奥利弗

3个回答

3

最终,我只能通过子类化NSTableHeaderCell来解决这个问题。这有点奇怪,因为Swift和Cocoa总是倾向于组合而非继承。

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

你的代码没有正常工作,字体大小没有效果,当你点击标题时,行为很奇怪。 - user3722523

2
修改attributedStringValue就可以解决问题。最初的回答。
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://istack.dev59.com/IXJyu.webp


tableView.tableColumns.forEach { (column) in... 这个方法对我有用,但只有第一列标题已更改。我该如何指定所有列标题? - S Lareau

1
你可以创建一个NSTableHeaderCell子类并实现你想要更改的属性。
在Objective-C中(我不擅长Swift):
@implementation CustomTableHeaderCell

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

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

@end

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

Screenshot

在Cocoa中,有很多东西你不能通过cell.font = ...来改变其风格,你需要创建一个子类。

属性字体已经是 NSTableHeaderCell 的基类 NSCell 的一部分了。因此,该属性已经存在,但某种原因它并未被考虑。 - Oliver Koehler
@OliverKoehler 我在 Swift 中尝试了我的解决方案,似乎不起作用。 - tomfriwel
不,你是对的。我创建了一个继承自NSTableHeaderCell的CustomTableHeaderCell。然而,只需设置基类(NSView)的属性即可使其正常工作。我回到工作时会上传我的代码。 - Oliver Koehler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接