我有一个用 Swift 编写的 OS X 应用程序(感谢 Mathias 和 Gallagher),它使用基于单元格的 NSTableView。客户的要求之一是能够增加每个文本字段单元格中显示的文本的字体大小。经过一些堆栈溢出谷歌搜索后,这一切看起来都非常简单:将每个 NSTableView 列的 dataCell 字体设置为所需的字体和大小;然后子类化 NSTextFieldCell 并覆盖 drawInteriorWithFrame 和 titleRectForBounds 并调整高度以适合矩形。
但是,由于 Apple 已经弃用基于单元格的 NSTableView,转而使用基于 View 的 NSTableView,因此我认为应该将代码更改为基于 View 。
啊啊!看似简单的改变却让我揪心了两天。我可以让文本字体大小改变得很好,但 NSTextFieldCell NSRect 高度保持固定。我在网上看到的一些示例适用于 iOS,不适用于 OS X。
有没有简单的方法可以做到这一点?
最佳答案
我将你的问题标记为最喜欢的,尝试过,失败了,并且睡了很长时间。但我认为我已经为所有 future 的 Google 员工解决了这个问题。
您不必为此子类化任何内容。试试这个:
在界面生成器中:
- 选择 TableView 单元格(屏幕截图中的#1),打开身份检查器 (
Cmd + Opt + 3
),并将其标识符设置为myTableViewCell
- 选择文本单元格(屏幕截图中的 #2),打开文件检查器 (
Cmd + Opt + 1
) 并取消选中使用自动布局
在你的 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/