10

我有一个 NSTableView,其第一行从顶部向下推 10 pt。标题已关闭,没有分组行,单元格间距为 0,封闭滚动视图的内容插入为 0。


更新

这是一个演示该问题的示例项目。


这是视图层次结构调试器的抓取:

在此处输入图像描述

NSTableRowView这是在视图层次调试器中暂停时第一行的垂直约束:

在此处输入图像描述

我尝试实现委托的tableView(_:didAdd:forRow:)并检查约束,首先使用constraintsAffectingLayout(for:)

[<NSLayoutConstraint:0x60000390bd40 'NSTableRowView_Encapsulated_Layout_Height' NSTableRowView:0x7fdb12e26eb0.height == 24 priority:500   (active)>]

然后打印所有行视图的约束

  - 0 : <NSLayoutConstraint:0x60000390bcf0 'NSTableRowView_Encapsulated_Layout_Width' NSTableRowView:0x7fdb12e26eb0.width == 329 priority:500   (active)>
  - 1 : <NSLayoutConstraint:0x60000390bd40 'NSTableRowView_Encapsulated_Layout_Height' NSTableRowView:0x7fdb12e26eb0.height == 24 priority:500   (active)>
  - 2 : <NSAutoresizingMaskLayoutConstraint:0x60000390bbb0 h=--& v=-&- InlineCell.minX == 16   (active, names: InlineCell:0x7fdb12e283a0, '|':NSTableRowView:0x7fdb12e26eb0 )>
  - 3 : <NSAutoresizingMaskLayoutConstraint:0x60000390bc00 h=--& v=-&- InlineCell.width == 297   (active, names: InlineCell:0x7fdb12e283a0 )>
  - 4 : <NSAutoresizingMaskLayoutConstraint:0x60000390bc50 h=--& v=-&- InlineCell.minY == 0   (active, names: InlineCell:0x7fdb12e283a0, '|':NSTableRowView:0x7fdb12e26eb0 )>
  - 5 : <NSAutoresizingMaskLayoutConstraint:0x60000390bca0 h=--& v=-&- V:[InlineCell]-(0)-|   (active, names: InlineCell:0x7fdb12e283a0, '|':NSTableRowView:0x7fdb12e26eb0 )>

单元格的minY约束设置为 0,但该行正在使用自动调整大小的掩码。该表使用一个简单的 diffable 数据源:

NSTableViewDiffableDataSourceReference(tableView: table) { tableView, column, row, item in
    guard let cell = tableView.makeView(withIdentifier: inlineCellIdentifier, owner: self) as? NSTableCellView else { 
        preconditionFailure("Failed to create results cell") 
    }
    cell.textField?.textColor = self.themeAttributes.color
    cell.textField?.font = self.themeAttributes.font
    cell.textField?.stringValue = self.displayString(for: item)
    return cell
}

唯一实现的委托方法是tableView(_:heightOfRow:)。该表与同级文本视图的行对齐,因此它从那里获取行高:

func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
    guard let layoutManager = editor?.layoutManager else { 
        preconditionFailure("Missing layout manager in editor") 
    }
    return height(of: row, in: layoutManager)
}

这似乎很明显,但我不明白为什么表会强制它的行像这样偏移。我在这个论坛上发现了很多问题,询问如何在表格顶部插入一个间隙,而不是如何删除一个。有什么建议吗?

4

1 回答 1

18

正如一些评论中所说,这不是一个错误,它是NSTableViewBig Sur 中工作方式的一种新方式(实际上有一个错误,但在其他地方,见下文)。免费的 Pascal 站点包含对新功能的很好的概述

NSTableView房源

macOS Big Sur 引入了新NSTableView属性:

style文档:

此属性的默认值NSTableView.Style.automatic在 macOS 11 中。链接到以前 macOS 版本的应用程序默认为NSTableView.Style.fullWidth.

effectiveStyle文档:

如果style属性值为NSTableView.Style.automatic,则此属性包含已解析的样式。

.automatic文档

系统通过以下方式解析表格视图样式:

  • 如果表格视图位于侧边栏拆分视图控制器项中,则effectiveStyle解析为NSTableView.Style.sourceList.
  • 如果表格的滚动视图有边框,则effectiveStyle解析为NSTableView.Style.fullWidth.
  • 否则effectiveStyle解析为NSTableView.Style.inset. 但是,如果表格需要额外空间来容纳其列单元格,则effectiveStyle解析为NSTableView.Style.fullWidth.

您的表格视图.automatic在 Main.storyboard 中设置了样式。这意味着有效样式解析为.inset围绕内容的 -> 10pt(基于.automatic文档中的规则)。

打开带有选定行的视图调试器。可以看到.inset样式效果:

在此处输入图像描述

用于.fullWidth删除 10pt 插图。

您还可以测试.automatic样式行为 - 尝试为滚动视图添加边框。解决为.fullWidth

错误和解决方法

您可能尝试在 Interface Builder 中将表格视图样式设置为全宽。它不起作用。无论您选择什么值,它的行为都像.automatic.

将以下行添加到您的代码中以解决此问题:

tableView?.style = .fullWidth

现在按预期工作:

在此处输入图像描述

报告为 FB8258910。

于 2020-08-04T07:54:44.797 回答