基于OSX视图的NSTableView字体更改

时间:2016-04-14 21:45:01

标签: swift macos fonts nstableview

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

然而,由于Apple贬低了基于单元格的NSTableViews而不支持基于视图,我认为我应该将我的代码更改为基于视图。

哎呀!看起来这么简单的改变让我有两天头发拉扯悲伤。我可以让文本字体大小改变,但NSTextFieldCell NSRect高度保持不变。我在网上看到的几个例子都是针对iOS而不适用于OS X.

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:0)

我把你的问题标记为最喜欢的,尝试过,失败了,并且长时间睡在它上面。但我想我已经为所有未来的Google员工解决了这个问题。

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

在Interface Builder中:

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

    在视图控制器中:

    连接插座和操作,你应该没问题:

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