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

时间:2017-06-22 11:55:04

标签: swift macos nstableview

我的OS X应用的行高NSTableView为<{1}}:

myTableView.rowSizeStyle = .large

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

请参阅下面的代码。我有三列,前两列使用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
}

我的代码几乎基于Apple's document:“创建和配置NSTextField单元格”。

结果如下:

enter image description here

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

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

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

2 个答案:

答案 0 :(得分:6)

简单的解决方案:

不要在代码中创建UI元素,请在Interface Builder中执行。链接的Apple文档声明:

  

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

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

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

下面的屏幕截图使用完全没有代码,方法

除外
func numberOfRows(in tableView: NSTableView) -> Int {
    return 10
}

enter image description here

修改

或者Column1 - NSTextField列 - 将文本字段包装在NSTableCellView实例中并指定一个框架,例如(switch语句为如果表视图也使用了section / group rows,那么swiftier tableColumn只能是nil

   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

    }

注意:

考虑NSTextView列中的文字只能通过NSAttributedString文本视图中居中,或者您必须为封闭滚动视图指定一个框架。 / p>

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

答案 1 :(得分:-3)

首先,不要以实际方式创建对象,如果你想做一个继承自TabelviewCell的类,并将所有单元代码放在这里。 之后,您必须检查您尝试管理的单元格和场地的约束。

如果你简单地在stroyboard中添加字段并对它们设置约束,它将正常工作。 尝试标签,并在固定水平宽度后使其成为多线。