gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:31:55 33 4
gpt4 key购买 nike

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

结果如下:

enter image description here

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

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

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

最佳答案

简单的解决方案:

不要在代码中创建 UI 元素,而是在 Interface Builder 中创建。链接的 Apple 文档指出:

The most likely situation is that you’ll have designed a cell in Interface Builder and will want to fetch it and then populate the values in that cell

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

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

下面的截图使用除了方法之外没有任何代码

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

enter image description here

编辑:

或者 Column1 - NSTextField 列 - 将文本字段包装在 NSTableCellView 实例中并指定一个框架,例如(switch 语句是 swiftier 并且 tableColumn 只能是 nil 如果 TableView 也使用部分/组行):

   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 在 TextView 中 居中,或者您必须为封闭的 ScrollView 。

PS:在 Interface Builder – SCNR 中要简单得多。

关于swift - 将一些文本垂直居中放置在 NSTableView 的行中的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44698724/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com