如何在 macOS 10.12+ 上自定义 NSTableView 标头?
Posted
技术标签:
【中文标题】如何在 macOS 10.12+ 上自定义 NSTableView 标头?【英文标题】:How to customize NSTableView header on macOS 10.12+? 【发布时间】:2016-09-16 00:57:39 【问题描述】: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 is drawing”,但表格标题的字体没有改变。
【问题讨论】:
您是否尝试设置attributedStringValue
?
@Willeke 是的,我尝试设置属性字符串值。我的设置被忽略了。
@sam 在我使用attributedStringValue
实现的MyHeaderCell 中完美运行!所以我猜你的代码有问题。你可能会发现一些提示here
@HeinrichGiesen, Willeke:当我在 drawInterior() 覆盖中分配属性字符串值时,它确实有效。我之前在 headerCell 上设置了属性字符串值属性,但该设置被忽略了。谢谢你们俩。
【参考方案1】:
感谢@HeinrichGiesen 和@Willeke 的cmets,我得到了它的工作。我把它贴在这里,以防它帮助别人。请注意,我自定义背景颜色的方式不是那么灵活。我真的只是在为默认绘图着色。这对我的目的来说已经足够了。
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)
【讨论】:
【参考方案2】:已经有一段时间没有人回答这个问题了。我在使用 Swift 5 和 Xcode 12 时遇到了同样非常令人沮丧的问题。这是我使用不需要子类化的 nstableview 方法所学到的。
在func tableView(_ myTable: NSTableView...开头添加如下代码行:
tableColumn?.headerCell.drawsBackground = true
tableColumn?.headerCell.backgroundColor = fill1Tint
这段代码改变了 headerCell 背景颜色(并且 fill1Tint 是一些 NSColor)。
然后添加:
let paragraphStyle: NSMutableParagraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.center
在每个 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])
此代码同时启用不同的背景和居中的属性文本。
【讨论】:
大多数NSTableVIewDataSource
和NSTableViewDelegate
方法以func tableView(_ tableView: NSTableView,
开头。 func tableView(_ myTable: NSTableView...
是哪个方法?以上是关于如何在 macOS 10.12+ 上自定义 NSTableView 标头?的主要内容,如果未能解决你的问题,请参考以下文章
如何在VMware上安装macOS Sierra 10.12
Jenkins 无法在 macOS 10.12 (Sierra) 上启动
macOS 10.12 brew install openssl 问题
Appium Doctor - 无法在 MacOS 10.12 上将 $JAVA_HOME/bin 设置为 PATH 变量