如何在macOS 10.12+上自定义NSTableView标头?

时间:2016-09-16 00:57:40

标签: macos cocoa nstableview swift3 nstableheadercell

MacOS 10.12 +,Xcode 8+,Swift 3:

我想以编程方式自定义NSTableView标头的字体和绘图。我知道有关于此问题的老问题,但我找不到今天有用的东西。

例如,我尝试将NSTableHeaderCell子类化为设置自定义字体:

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

然后在我的表视图中使用该子类:

tableColumn.headerCell = MyHeaderCell()

我看到消息" MyHeaderCell正在绘制"在控制台中,但表头的字体不会改变。

2 个答案:

答案 0 :(得分:2)

感谢@HeinrichGiesen和@Willeke的评论,我得到了它的工作。我在这里张贴它,以防它帮助某人下线。请注意,我自定义背景颜色的方式并不灵活。我真的只是画了默认图纸。它对我的目的来说足够好了。

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

答案 1 :(得分:0)

已经有一段时间没有人解决这个问题了。我在使用 Swift 5 和 Xcode 12 时遇到了同样非常令人沮丧的问题。这是我使用不需要子类化的 nstableview 方法学到的东西。

  1. 在func tableView(_ myTable: NSTableView...的开头添加以下几行代码:

     tableColumn?.headerCell.drawsBackground = true
     tableColumn?.headerCell.backgroundColor = fill1Tint 
    

这段代码改变了 headerCell 的背景颜色(fill1Tint 是一些 NSColor)。

然后添加:

    let paragraphStyle: NSMutableParagraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = NSTextAlignment.center
  1. 在每个 tableColumn.identifier 块中,添加一个属性文本字符串,例如:

         let title: String = "Value"
         tableColumn?.headerCell.attributedStringValue = NSAttributedString(string: title, attributes: [
             NSAttributedString.Key.font: fontMedium,
             NSAttributedString.Key.foregroundColor: text1Tint,
             NSAttributedString.Key.paragraphStyle : paragraphStyle])
    

此代码启用不同的背景和居中的属性文本。