我有一个NSTableView,它的第一行从顶部向下推了10点。标头被关闭,没有组行,单元格间距为0,包围滚动视图的内容嵌入为0。
更新
下面是一个演示这个问题的样本工程。
下面是视图层次结构调试器的抓取:
在视图层次结构调试器中暂停时,第一行的NSTableRowView
的垂直约束如下:
我尝试实现委托的::didAdd:forRow:)并检查约束,首先使用constraintsAffectingLayout(用于:)
[<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,但该行使用的是自动调整掩码。该表使用了一个简单的、可扩展的数据源:
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
}
实现的唯一委托方法是*高行:)。该表与同级文本视图的行对齐,因此从那里获得行高:
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)
}
这似乎是显而易见的,但我不明白为什么表会强迫其行像这样被抵消。我在这个论坛上发现了很多问题,询问如何在桌面上插入一个缺口,而不是如何消除一个缺口。有什么建议吗?
发布于 2020-08-04 07:54:44
它不是一个bug,正如在一些评论中所说的,它是NSTableView
在Big中工作的一种新方式(实际上有一个bug,但在其他地方,见下文)。免费Pascal站点包含什么是新事物的很好的概述。
新的NSTableView
性质
macOS Big引入了新的NSTableView
特性:
style
文档:
此属性的默认值是
NSTableView.Style.automatic
中的macOS 11。链接到以前的macOS版本的应用程序默认为NSTableView.Style.fullWidth
。
effectiveStyle
文档:
如果
style
属性值为NSTableView.Style.automatic
,则此属性包含解析样式。
系统以下列方式解析表视图样式:
effectiveStyle
解析为NSTableView.Style.sourceList
。effectiveStyle
解析为NSTableView.Style.fullWidth
。effectiveStyle
将解析为NSTableView.Style.inset
。但是,如果表需要额外的空间来适应其列单元格,则effectiveStyle
将解析为NSTableView.Style.fullWidth
。表视图的样式在.automatic
中设置为Main.storyboard。这意味着有效的样式将围绕内容解析为.inset
-> 10 on (基于.automatic
文档中的规则)。
使用选定的行打开视图调试器。您可以看到.inset
样式的效果:
使用.fullWidth
删除10 to内嵌。
您还可以测试.automatic
样式的行为--尝试向滚动视图添加边框。决定采用.fullWidth
。
Bug与解决办法
您可能试图在Interface中将表视图样式设置为全宽度。它不起作用。无论您选择什么值,它的行为都类似于.automatic
。
在代码中添加以下行以解决此问题:
tableView?.style = .fullWidth
现按预期工作:
报告为FB8258910。
https://stackoverflow.com/questions/63175168
复制相似问题