【问题标题】:What's the right way to put some text vertically centered in a NSTableView's row?将一些文本垂直居中放置在 NSTableView 的行中的正确方法是什么?
【发布时间】:2017-11-25 16:38:20
【问题描述】:

我的 OS X 应用有一个 NSTableView 具有更大的行高:

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 单元”。

结果如下:

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

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

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

【问题讨论】:

  • @EricAya 我会试一试,但对于每个想要做同样的事情的人来说,这都是常见的方式吗?这听起来比我想象的要复杂,因为应该有很多人遇到同样的问题。
  • @EricAya 奇怪的是,如果你曾经使用 NSTableView 设计过一个 OS X 应用程序,你不会遇到同样的问题吗?

标签: swift macos nstableview


【解决方案1】:

简单的解决方案:

不要在代码中创建 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
}

编辑:

对于Column1NSTextField 列 – 将文本字段包装在 NSTableCellView 实例中并指定一个框架,例如(switch 语句是 swiftier 和 @987654335 @ 只能是 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 在文本视图居中,否则您必须为封闭的滚动视图指定一个框架。

PS:在 Interface Builder – SCNR 中使用起来要容易得多。

【讨论】:

  • 好吧,如果使用IB,我知道如何解决这个问题。我有一些理由不使用 IB,所以我的问题真的只是以编程方式对 UI 进行编码。
  • 好吧,然后也以编程方式添加 AutoLayout 约束
【解决方案2】:

首先不要务实地创建对象,如果你想创建一个从 TabelviewCell 继承的类,并且你所有的单元格代码都放在这里。 之后,您必须检查要管理的单元格和字段的约束。

如果您在 stroyboard 中简单地添加字段并对其施加约束,它将正常工作。 在修复它的水平宽度后尝试标签并使其成为多行。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多