NSTableView:创建“重叠”行

Posted

技术标签:

【中文标题】NSTableView:创建“重叠”行【英文标题】:NSTableView: Create "Overlapping" Rows 【发布时间】:2016-07-18 22:58:28 【问题描述】:

目标

我的应用中有一个 NSTableView,我想绘制“重叠”行以创建类似于 Automator.app 中的“连接”效果:


我正在尝试什么

我正在考虑的方法是使用 NSTableView 的-(NSRect)frameOfCellAtColumn:(NSInteger)columnIndex row:(NSInteger)rowIndex 方法在第一行之后增加所有行的 Y 原点。我的 tableView 是基于视图的,它不使用自动布局。

我的问题是:这是实现这种效果的正确方法吗?让 tableView 绘制具有重叠帧的行似乎是“危险的”,我不知道这是否会导致 tableView 底部出现一堆额外的空白空间(因为 tableView 不会重叠在计算其整体高度时将框架考虑在内;它只使用每行的 rowHeight 值的总和。)

有谁知道是否有不同的规范方式来实现 Automator tableView 的效果?

【问题讨论】:

不让单元格重叠,为什么不将三角形的尖端包含在具有圆形顶部的单元格的背景图像中。这创造了没有复杂性的重叠错觉 我考虑过这种方法。但是当我查看 Automator 时,Apple 绝对不是这样做的。如果拖动其中一行,很明显三角形和半圆是 cellView 本身的一部分,而不是在背景中绘制的。选择突出显示还在三角形/半圆周围绘制了一个漂亮的蓝色边框,该边框自然地延伸到单元格的边框。而且,由于 Automator 和我的应用程序中的单元格都是“可折叠的”,因此计算在后台进行虚假绘图的精确点变得非常困难。 不过,问题在于您没有理由相信 Automator 使用的是表格视图,而不是(自定义?)堆叠视图。因此,就如何使用表格视图复制它来寻求建议会牵扯到潜在响应者的双手。 真;我不能证明它不是另一个类。但它拥有 NSTableView 的所有机制。当您拖动一行时,该行会突然“捕捉”到它不重叠的位置。这让我相信有一些魔法正在发生,只是调整帧。 【参考方案1】:

正如 Patrick Goley 建议的那样,我认为您应该通过将连接点绘制为背景或表格视图分隔符的一部分来伪造它。

Apple 的 HoverTableDemo sample 说明了一些技术,WWDC 2011 session 120 video“基于视图的 NSTableView 基本到高级”更详细地描述了它们。

我认为您应该设置表格视图的intercellSpacing 以适应连接点图像的大小。您可以将gridStyleMask 设置为包含NSTableViewSolidHorizontalGridLineMask

您将使用NSTableRowView 的自定义子类来自定义绘制背景和分隔符(在行之间)。你会为这些覆盖 -drawBackgroundInRect:-drawSeparatorInRect:

您可以使用NSTableView 的自定义子类来自定义绘制超出行尾的网格,如果您想要的话,这可能只是最后一行底部的箭头。你会覆盖 -drawGridInClipRect: 来做到这一点。

【讨论】:

请参阅对原始问题的评论,了解我为什么不走这条路。 (这也是我的第一个想法。)

以上是关于NSTableView:创建“重叠”行的主要内容,如果未能解决你的问题,请参考以下文章

正确调整基于视图的 NSTableView 上的行大小

NSTableView:检测鼠标点击以及行和列

更改NSTableView备用行颜色

从 NSTableView 拖放到 Finder 的问题

具有自定义高度的 NSTableView 部分横幅列

升级项目后:删除现有行后 NSTableVIew 无法正确更新