NSScrollView 中的 NSTableView 在拖动时不会自动滚动

NSTableView in NSScrollView doesn't autoscroll when dragging

我目前正在 OS X 应用程序的 table 视图中实施拖放重新排列。虽然正常滚动工作正常,但在拖动时自动滚动完全坏了。

如果我抓住一个单元格并开始拖动,自动滚动只会告诉 table 滚动到顶部。如果我在拖动过程中使用触控板手动滚动,table 会不断弹出到顶部。如果我拖动其中一个顶部单元格,table 在靠近底部拖动时不会自动向下滚动。

我继承了 NSScrollView 并覆盖了 scrollClipView 方法。我看到它被一些内部自动滚动方法调用,坐标为 (0, 0)。

因为我看不到那个内部方法在做什么,而且 Goggle 和 SO 什么也没有出现,所以我有点卡住了。

有没有人运行以前处理过这个问题?根据过去的经验,我觉得它与 AutoLayout 相关,但我不知道是什么。或者可能是完全不相关的东西。

关于如何进一步排除故障的任何想法?

我运行进入同样的问题。在我的例子中,问题是我在 Interface Builder 中将 NSTableCellView 的高度设置为 10,000,这样水平分隔符就不会在实际行下方的空行中显示。

然而,我的NSTableCellViews在运行时加载的实际高度是43px。

因此,当我开始拖动单元格对其重新排序时,NSScrollView 试图一次滚动 10,000 个像素,而不是一次滚动 43 个。

这似乎是一个错误,因为我的 NSOutlineView 子类确实实现了以下方法来动态设置每行的高度。

func outlineView(_ outlineView: NSOutlineView, heightOfRowByItem item: Any) -> CGFloat

显然在拖放操作期间自动滚动机制忽略了该方法,并且仅使用在 Interface Builder 中设置的值。

所以我只是在 Interface Builder 中将虚拟 NSTableCellView 的高度更改为 43px,我将接受为空行显示的水平分隔符。