4

我正在尝试为我的 NSTableView 生成一个自定义标题。我想更改标题文本的字体并删除边框和垂直分隔符。

我当前的顶部和底部标题如下所示:

在此处输入图像描述

请问有谁知道我该怎么做?

更新:应用修复后,标题现在看起来符合我的预期:

在此处输入图像描述

4

5 回答 5

6

实际上,来自 mprudhom 和 Pronto 的答案都对最终修复做出了很好的贡献。非常感谢你们俩。

我想我会发布我的最终答案,以便任何关注的人都可以看到我是如何修复它的。

我不能单独使用 mprudhom 的代码,因为我的表只有一个 NSTableHeaderView 而没有 TableHeaderCells。幸运的是,Pronto 对此进行了救援:

class MyTable: NSTableView, NSTableViewDataSource, NSTableViewDelegate
{
    override func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?
    {
        tableColumn!.headerCell = MyTableHeaderCell(textCell: tableColumn!.identifier)
    }
}

我直接从 mprudhom 使用了 NSTableHeaderCell 代码:

final class MyTableHeaderCell : NSTableHeaderCell
{
    required init?(coder aDecoder: NSCoder)
    {
        fatalError("init(coder:) has not been implemented")
    }

    override init(textCell: String)
    {
        super.init(textCell: textCell)
        self.font = NSFont.boldSystemFontOfSize(14)
    }

    override func drawWithFrame(cellFrame: NSRect, inView controlView: NSView)
    {
        //super.drawWithFrame(cellFrame, inView: controlView)//, since that is what draws borders
        self.drawInteriorWithFrame(cellFrame, inView: controlView)
    }

    override func drawInteriorWithFrame(cellFrame: NSRect, inView controlView: NSView)
    {
        let titleRect = self.titleRectForBounds(cellFrame)
        self.attributedStringValue.drawInRect(titleRect)
    }
}

一旦实现了这两种方法,我遇到了最后一个问题,即 NSTableHeaderView 没有按要求绘制边框,但确实有灰色背景。所以我用这个方法覆盖了 NSTableHeaderView 类:

class ForecastHeaderView : NSTableHeaderView
{
    required init?(coder: NSCoder)
    {
        super.init(coder: coder)
    }

    override init(frame frameRect: NSRect) 
    {
        super.init(frame: frameRect)
        self.wantsLayer = true
    }

    override func drawLayer(layer: CALayer, inContext ctx: CGContext)
    {
        super.drawLayer(layer, inContext: ctx)
        layer.backgroundColor = CGColorCreateGenericGray(1.0, 1.0)
    }
}
于 2015-09-23T11:11:06.577 回答
3

一种方法,在您的NSTableViewDelegate's viewForTableColumn-function 中:

if tableColumn!.identifier == "description" {
    let cell = NSTableHeaderCell()
    cell.title = "New Title"
    cell.backgroundColor = NSColor.redColor()
    cell.drawsBackground = true
    cell.bordered = false
    cell.font = NSFont(name: "Helvetica", size: 16)
    tableColumn!.headerCell = cell
}
于 2015-09-23T00:36:43.523 回答
1

您需要通过子类化自己来接管绘图NSTableHeaderCell,如下所示:

final class CustomTableHeaderCell : NSTableHeaderCell {
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override init(textCell: String) {
        super.init(textCell: textCell)
        self.font = NSFont.boldSystemFontOfSize(20)
    }

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

    override func drawInteriorWithFrame(cellFrame: NSRect, inView controlView: NSView) {
        let titleRect = self.titleRectForBounds(cellFrame)
        self.attributedStringValue.drawInRect(titleRect)
    }
}

如果您以编程方式设置表格,您可以这样做:

let col = NSTableColumn(identifier: id)
col.headerCell = CustomTableHeaderCell(textCell: title)
col.title = title
self.dataTableView.addTableColumn(col)

否则,您应该能够在 Interface Builder 中将类的名称设置为子类的名称。

于 2015-09-22T20:56:49.677 回答
1

以上答案也可以直接使用,您可以在 viewDidLoad 中使用

override func viewDidLoad() {
        super.viewDidLoad()   
        tableView.tableColumns.forEach { (column) in
                column.headerCell.backgroundColor = NSColor.white
                column.headerCell.drawsBackground = true
                column.headerCell.isBordered = false
                column.headerCell.attributedStringValue = NSAttributedString(string: column.title, attributes: [NSAttributedString.Key.font: NSFont.systemFont(ofSize: 13)])
              }
}
于 2020-12-26T12:43:11.013 回答
0

在 macOS 11 中似乎有效的方法:

  1. 设置 NSTableHeaderCell 背景

     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
     tableColumn?.headerCell.drawsBackground = true
     tableColumn?.headerCell.backgroundColor = .orange
     ...
    
  2. 将 IB 中的 NSTableView 样式设置为全宽

于 2021-10-14T18:21:17.130 回答