将一些文本垂直居中放在NSTableView行中的正确方法是什么?

Joe*_*ang 11 macos nstableview swift

我的OS X应用程序具有NSTableView更大的行高:

myTableView.rowSizeStyle = .large
Run Code Online (Sandbox Code Playgroud)

我尝试在其中放入一些文字,但我发现我放入的文字不能垂直居中.

请参阅下面的代码.我有三列,前两个使用NSTextFieldNSTextView放置一些文本.第三个是复选框按钮.

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

    if (tableColumn?.identifier == "Column1") {

        let field = NSTextField()
        field.stringValue = "someText"
        field.isBordered = false
        field.isEditable = false
        field.backgroundColor = NSColor.red
        return field
    } else if (tableColumn?.identifier == "Column2") {

        let field = NSTextView()
        field.string = "someText"
        field.backgroundColor = NSColor.green
        return field
    } else if (tableColumn?.identifier == "Column3") {

        let field = NSButton()
        field.setButtonType(NSSwitchButton)
        field.title = "check me"
        return field
    }

    return nil
}
Run Code Online (Sandbox Code Playgroud)

我的代码几乎基于Apple的文档:"创建和配置NSTextField单元".

结果如下:

在此输入图像描述

如您所见,前两列中的文本不是垂直居中,而复选框是自动垂直居中的.

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?像Apple文档所示使用时,放置文本以使其可以垂直居中的正确方法是什么?

编辑:出于某种原因,我不使用Interface Builder.因此问题坚持以编程方式对UI进行编码.

vad*_*ian 6

简单方案:

不要在代码中创建UI元素,在Interface Builder中执行.链接的Apple文档指出:

最可能的情况是,您将在Interface Builder中设计一个单元格,并希望获取它,然后填充该单元格中的值

  • 对于NSTextView列,删除预定义的表格单元格视图并拖动NSTextView列中的实例.调整视图大小并添加缺少的AutoLayout约束.
  • 对于第二个垂直排列的列中使用预定义的表格单元视图和添加约束Align Center XAlign Center YNSTextField对象.
  • 对于复选框列,请删除NSTextField预定义表格单元格视图中的实例,将复选框拖到视图中并添加Align Center Y其他缺少的约束.

强烈建议使用Cocoa Bindings将表视图连接到数据源.

除了方法之外,下面的屏幕截图根本不使用任何代码

func numberOfRows(in tableView: NSTableView) -> Int {
    return 10
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑:

或者Column1- NSTextField列 - 在NSTableCellView实例中包装文本字段 并指定一个框架,例如(一个switch语句更快,tableColumn只有nil在表视图也使用了section/group行时):

   switch tableColumn!.identifier {

    case "Column1":
        let cellView = NSTableCellView()
        // the value for y: in the frame should be row.height / 2 - textField.height / 2
        let field = NSTextField(frame: NSRect(x:0.0, y:10.0, width:tableColumn!.width, height:17.0))
        field.stringValue = "someText"
        field.isBordered = false
        field.isEditable = false
        field.backgroundColor = NSColor.red
        cellView.addSubview(field)
        return cellView

    case "Column2":

        ...

    default: return nil

    }
Run Code Online (Sandbox Code Playgroud)

注意:

请考虑NSTextView列中的文本只能文本视图中居中,NSAttributedString或者您必须为封闭的滚动视图指定框架.

PS:在Interface Builder - SCNR中如此容易得多.

  • 好吧,如果使用IB,我知道如何解决这个问题。我有一些原因不使用 IB,所以我的问题实际上只是以编程方式编码 UI。 (2认同)
  • 好吧,然后以编程方式添加AutoLayout约束 (2认同)