【发布时间】:2012-04-25 22:14:10
【问题描述】:
我有一个简单的、单列、基于视图的 NSTableView,其中包含可以拖动以重新排序的项目。在拖放过程中,我想让它在鼠标下方的位置打开要放置的项目的间隙。当您拖动以重新排序曲目时,GarageBand 会执行类似的操作(此处为视频:http://www.screencast.com/t/OmUVHcCNSl)。据我所知,在 NSTableView 中没有内置支持。
有没有其他人尝试将此行为添加到 NSTableView 并找到一个好的解决方案?我已经想到并尝试了几种方法,但没有取得多大成功。我的第一个想法是通过在我的数据源的-tableView:validateDrop:... 方法中发送-noteHeightOfRowsWithIndexesChanged:,然后在-tableView:heightOfRow: 中返回两倍的正常高度,在拖动过程中将鼠标下的行的高度加倍。不幸的是,据我所知,NSTableView 在拖放过程中不会更新其布局,因此尽管调用了noteHeightOfRowsWithIndexesChanged:,但实际上并没有更新行高。
请注意,我使用的是基于视图的 NSTableView,但我的行并不复杂,如果这样做有助于实现这一点,我无法移动到基于单元格的表视图。我知道在拖动完成后为放置的项目设置动画间隙的简单内置功能。我正在寻找一种在拖动过程中打开间隙的方法。此外,这是针对要在 Mac App Store 中销售的应用程序,因此不得使用私有 API。
编辑:我刚刚向 Apple 提交了一项增强请求,请求内置支持此行为:http://openradar.appspot.com/12662624。 如果你也想看的话,请假。 更新:我要求的增强功能已在 OS X 10.9 Mavericks 中实现,现在可以使用 NSTableView API 实现此行为。见NSTableViewDraggingDestinationFeedbackStyleGap。
【问题讨论】:
-
我也想知道怎么做!
-
我不确定这是否可行,但是在移动时插入一个空白行怎么样?
-
@Inafziger 我也想到了这一点,但我认为“不幸的是,我能说的最好的情况是,NSTableView 在拖放过程中不会更新其布局”使得它不起作用。
-
是的,问题是 NSTableView 在拖动处于活动状态时会停止更新布局。也许这种行为可以通过子类化来克服,但我不知道如何。
-
你可以拖动项目并且让拖动操作不属于 NSTableView 的一部分吗?
标签: objective-c macos cocoa drag-and-drop nstableview