swift - OSX 基于 View 的 NSTableView 字体更改

标签 swift macos fonts nstableview

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

但是,由于 Apple 已经弃用基于单元格的 NSTableView,转而使用基于 View 的 NSTableView,因此我认为应该将代码更改为基于 View 。

啊啊!看似简单的改变却让我揪心了两天。我可以让文本字体大小改变得很好,但 NSTextFieldCell NSRect 高度保持固定。我在网上看到的一些示例适用于 iOS,不适用于 OS X。

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

最佳答案

我将你的问题标记为最喜欢的,尝试过,失败了,并且睡了很长时间。但我认为我已经为所有 future 的 Google 员工解决了这个问题。


您不必为此子类化任何内容。试试这个:

在界面生成器中:

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

enter image description here

在你的 View Controller 中:

连接 socket 和操作,应该没问题:

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

关于swift - OSX 基于 View 的 NSTableView 字体更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36634559/

相关文章:

Swift 防止 Unicode 字符的表情符号表示

macos - AVPlayer 自动播放

macos - 分配的键盘快捷键 osx 的全局列表?

c++ - 为什么删除事件发生在文件写入时?

css - 如何修复字体上的土耳其字符?

CSS @font-face : how to use it properly?

ios - UITapGestureRecognizer 不适用于 .began 状态

swift - UITableview 将单元​​格移动到错误的部分,并用空白单元格替换其先前的位置

swift - Swift 中的切片是什么?

css - 15949 处的无效字体值警告 :4. 忽略:Angular4 产品构建