首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSTableView在第一行上方有多余的空间。

NSTableView在第一行上方有多余的空间。
EN

Stack Overflow用户
提问于 2020-07-30 14:19:15
回答 1查看 1.8K关注 0票数 10

我有一个NSTableView,它的第一行从顶部向下推了10点。标头被关闭,没有组行,单元格间距为0,包围滚动视图的内容嵌入为0。

更新

下面是一个演示这个问题的样本工程

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

在视图层次结构调试器中暂停时,第一行的NSTableRowView的垂直约束如下:

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

代码语言:javascript
运行
复制
[<NSLayoutConstraint:0x60000390bd40 'NSTableRowView_Encapsulated_Layout_Height' NSTableRowView:0x7fdb12e26eb0.height == 24 priority:500   (active)>]

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

代码语言:javascript
运行
复制
  - 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,但该行使用的是自动调整掩码。该表使用了一个简单的、可扩展的数据源:

代码语言:javascript
运行
复制
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
}

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

代码语言:javascript
运行
复制
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)
}

这似乎是显而易见的,但我不明白为什么表会强迫其行像这样被抵消。我在这个论坛上发现了很多问题,询问如何在桌面上插入一个缺口,而不是如何消除一个缺口。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

在代码中添加以下行以解决此问题:

代码语言:javascript
运行
复制
tableView?.style = .fullWidth

现按预期工作:

报告为FB8258910。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63175168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档