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

时间:2016-07-27 09:58:53

标签: cocoa drag-and-drop nstableview nsscrollview

我目前正在OS X应用中的表格视图中实施拖放重新排列。正常滚动工作正常,自动滚动,同时拖动它完全破碎。

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

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

enter image description here

由于我无法看到内部方法正在做什么,而Goggle和SO一无所获,我有点卡住了。

之前是否有人遇到此问题?从过去的经历来看,我感觉它与AutoLayout有关,但我不知道是什么。或者它可能是完全不相关的东西。

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

1 个答案:

答案 0 :(得分:2)

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

但是,在运行时加载的NSTableCellViews的实际高度为43px。

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

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

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

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

所以我只是在界面生成器中将虚拟NSTableCellView的高度更改为43px,我将只使用为空行显示的水平分隔符。