Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 基于OSX视图的NSTableView字体更改_Swift_Macos_Fonts_Nstableview - Fatal编程技术网

Swift 基于OSX视图的NSTableView字体更改

Swift 基于OSX视图的NSTableView字体更改,swift,macos,fonts,nstableview,Swift,Macos,Fonts,Nstableview,感谢Mathias和Gallagher使用基于cell的NSTableView,我有一个用Swift编写的OSX应用程序。客户的要求之一是能够增加每个文本字段单元格中显示的文本的字体大小。在谷歌搜索了一下堆栈溢出后,一切看起来都很简单:将每个NSTableView列的dataCell字体设置为所需的字体和大小;然后,对NSTextFieldCell进行子类化,并使用Frame和titleRectForBounds覆盖DrawInteriorWithInterior,并调整高度以适合rect 然而

感谢Mathias和Gallagher使用基于cell的NSTableView,我有一个用Swift编写的OSX应用程序。客户的要求之一是能够增加每个文本字段单元格中显示的文本的字体大小。在谷歌搜索了一下堆栈溢出后,一切看起来都很简单:将每个NSTableView列的dataCell字体设置为所需的字体和大小;然后,对NSTextFieldCell进行子类化,并使用Frame和titleRectForBounds覆盖DrawInteriorWithInterior,并调整高度以适合rect

然而,由于苹果公司已经贬低了基于cell的nstableview,转而支持基于视图的,我想我应该将代码改为基于视图的

啊!如此简单的改变让我痛苦了两天。我可以将文本字体大小更改得很好,但NSTextFieldCell NSRect高度保持不变。我在网上看到的几个例子都是针对iOS的,不适用于OSX


有什么简单的方法可以做到这一点吗?

我将你的问题标记为最喜欢的问题,尝试了一下,失败了,并且在这个问题上睡了很长时间。但我想我已经为所有未来的谷歌人解决了这个问题

你不应该为此对任何东西进行子类化。试试这个:

在界面生成器中: 在屏幕截图中选择表格视图单元格1,打开Identity Inspector 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()
    }
}

我不知道怎么简单。但通常的方法是使用字体大小计算文本的高度,然后使用该高度作为文本字段的高度。是什么让您认为必须使用基于视图的NSTableView来使用自定义字体大小?对于这样一个简单的任务,您不必对任何内容进行子类化。您可以使用委派来更改字体大小。您是否需要为每个单独的单元格使用不同的字体大小?每个单元格的大小不同?或者只是能够一起更改所有单元格使用的大小?我正在使用NSFont.systemFontOfSize计算文本的高度,这将正确设置表视图行的高度,但不会设置文本本身。谢谢!除了行中的文本没有垂直居中外,这几乎可以正常工作。然而,比以前好多了。