OSX 基于视图的 NSTableView 字体更改

Posted

技术标签:

【中文标题】OSX 基于视图的 NSTableView 字体更改【英文标题】:OSX view-based NSTableView font change 【发布时间】:2016-04-14 21:45:00 【问题描述】:

我有一个用 Swift 编写的 OS X 应用程序(感谢 Mathias 和 Gallagher),它使用基于单元格的 NSTableView。客户的要求之一是能够增加每个文本字段单元格中显示的文本的字体大小。经过一番堆栈溢出谷歌搜索后,这一切似乎都非常简单:将每个 NSTableView 列的 dataCell 字体设置为所需的字体和大小;然后继承 NSTextFieldCell 并覆盖 drawInteriorWithFrame 和 titleRectForBounds 并调整高度以适合矩形。

但是,由于 Apple 已弃用基于单元格的 NSTableView,转而支持基于视图,我想我应该将代码更改为基于视图。

啊!看似如此简单的变化,却让我这两天揪心的悲痛欲绝。我可以很好地改变文本字体大小,但 NSTextFieldCell NSRect 高度保持固定。我在网上看到的几个例子是针对 ios 的,不适用于 OS X。

有没有简单的方法可以做到这一点?

【问题讨论】:

我不知道容易。但这样做的一般方法是使用字体大小计算文本的高度,然后使用该高度作为文本字段的高度。 是什么让你认为必须使用基于视图的 NSTableView 才能使用自定义字体大小?对于这样一个简单的任务,您不必为任何东西子类化。 您可以使用委托来更改字体大小 您是否需要能够为每个单独的单元格(具有不同大小的单元格)使用不同的字体大小?或者只是能够同时更改所有单元格使用的大小? 我正在使用 NSFont.systemFontOfSize 计算文本的高度,这正确设置了表格视图行的高度,但不是文本本身。 【参考方案1】:

我把你的问题标记为收藏,试过了,失败了,睡了很长时间。但我想我已经为所有未来的 Google 员工解决了这个问题。


你不应该为此继承任何东西。试试这个:

在界面生成器中:

    选择表格视图单元格(屏幕截图中的#1),打开身份检查器(Cmd + Opt + 3)并将其标识符设置为myTableViewCell 选择文本单元格(屏幕截图中的#2),打开文件检查器 (Cmd + Opt + 1) 并取消选中使用自动布局

在您的视图控制器中:

连接出口和行动,你应该没问题:

class AppDelegate: NSObject, NSApplicationDelegate, NSTableViewDataSource, NSTableViewDelegate  

    @IBOutlet weak var window: NSWindow!
    @IBOutlet weak var tableView: NSTableView!

    var names = ["Luke Skywalker", "Han Solo", "Chewbecca"]
    var fontSize = NSFont.systemFontSize()

    func applicationDidFinishLaunching(aNotification: NSNotification) 
        self.tableView.setDataSource(self)
        self.tableView.setDelegate(self)
    

    func numberOfRowsInTableView(tableView: NSTableView) -> Int 
        return self.names.count
    

    func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? 
        let cellView = tableView.makeViewWithIdentifier("myTableViewCell", owner: self) as! NSTableCellView
        let textField = cellView.textField!
        let fontDescriptor = textField.font!.fontDescriptor

        textField.font = NSFont(descriptor: fontDescriptor, size: self.fontSize)
        textField.stringValue = self.names[row]
        textField.sizeToFit()
        textField.setFrameOrigin(NSZeroPoint)

        tableView.rowHeight = textField.frame.height + 2

        return cellView
    

    @IBAction func makeBigger(sender: AnyObject) 
        self.fontSize += 1
        self.tableView.reloadData()
    

    @IBAction func makeSmaller(sender: AnyObject) 
        self.fontSize -= 1
        self.tableView.reloadData()
    

【讨论】:

谢谢!除了行中的文本不是垂直居中之外,这几乎可以工作。不过比以前好多了。

以上是关于OSX 基于视图的 NSTableView 字体更改的主要内容,如果未能解决你的问题,请参考以下文章

将分隔符颜色更改为背景或从NSTableView中删除它

正确调整基于视图的 NSTableView 上的行大小

NSTableView 在滚动时非常滞后

基于视图的 NSTableView 中的自定义背景

基于视图的 NSTableView 的目标操作数据源更新

基于视图的 NSTableView 中的 NSPopupButton