【发布时间】:2020-07-30 14:19:15
【问题描述】:
我有一个 NSTableView,它的第一行从顶部向下推 10 pt。标题关闭,没有分组行,单元格间距为 0,封闭滚动视图的内容插入为 0。
更新
这里有一个 sample project 来演示这个问题。
这是视图层次调试器的抓取:
这是第一行的NSTableRowView 在视图层次调试器中暂停时的垂直约束:
我尝试实现委托的tableView(_:didAdd:forRow:) 并检查约束,首先使用constraintsAffectingLayout(for:):
[<NSLayoutConstraint:0x60000390bd40 'NSTableRowView_Encapsulated_Layout_Height' NSTableRowView:0x7fdb12e26eb0.height == 24 priority:500 (active)>]
然后打印所有行视图的constraints:
- 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)
}
这似乎很明显,但我不明白为什么表会强制它的行像这样偏移。我在这个论坛上发现了很多问题,询问如何插入表格顶部的空白,而不是如何删除。有什么建议吗?
【问题讨论】:
-
单元格间距可能是罪魁祸首吗? (你有我最深切的同情。我目前正在与 NSOutlineView 争论自动布局,它莫名其妙地坚持我的一行的高度限制为 0...)
-
很遗憾没有。单元格间距为 0,我不希望它应用在第一行之上,对吧?
-
在自动布局领域一切皆有可能。我现在无法重现此问题 - 您应该编辑您的帖子以更清楚地说明这是 MacOS 11 的问题。 (Diffable Data sources 是我在 WWDC 上错过的一个公告;感谢您指出)。如果它仍然存在,您可能需要为此提交错误。
-
还有一件事——如果你想让更多的人参与进来,我建议创建一个MRE 一个可以下载并使用它/检查它的人,...
-
感谢您的建议。 @green_knight:不相信这是一个大苏尔问题,但正如 zrzka 指出的那样,我应该制作一个示例项目来检查它。我会继续努力的——谢谢你让我保持直截了当:)
标签: macos nstableview appkit macos-big-sur