2017-09-27 107 views
1

我有一个具有拖放委托(iOS 11)的UITableView。在我的执行UITableViewDropCoordinator拖放(_:toRowAt :)不会执行动画

func tableView(_ tableView: UITableView, 
    performDropWith coord: UITableViewDropCoordinator) { 

...我打电话给协调员的drop(_:toRowAt:)。根据苹果公司的说法,这应该会导致拖动项目预览动画以精确覆盖单元格。但是这种事情没有发生。拖动项目预览正在缩小,就好像我根本不打电话drop(_:toRowAt:)

这个命令实际上是什么东西?

回答

0

UITableViewDropCoordinator drop(_:toRowAt:)实际上工作,但只在非常有限的一些情况下。这里是你有什么了解:

  • drop(_:toRowAt:)必须在performDropWith实现的主要部分被称为 - 而不是内部的异步调用loadObject。对于所有的UITableViewDropCoordinator drop命令都是如此。

  • drop(_:toRowAt:)是这样工作的:

    1. 首先,它快照在给定行的单元格。

    2. 然后,它将该快照替换为拖动项目预览,并将快照动画化以覆盖该行的单元格。

因此,drop(_:toRowAt:)仅在非常有限的情况下是有用的。当你发出这个命令时,如果有问题的单元由于丢弃而改变它的外观,单元必须重新加载 - 因为快照将对应于当前单元的状态drop命令已给出,并且您不希望单元格的旧的外观在预览中动画化。

由于这个原因,drop(_:toRowAt:)对于loadObject没有用。 (这是占位符的用途。)仅在本地拖动时才有用,您可以从拖动项目的localObject中立即获取数据。只有在简单的情况下,您可以将放到现有的电池上,替换为

例子:

guard let s = item.localObject as? String else {return} 
// ... update model using s ... 
tableView.reloadRows(at: [ip], with: .none) 
coordinator.drop(item, toRowAt: ip) 

请注意,我没有通话performBatchUpdatesdrop(_:toRowAt:)不适用于performBatchUpdates,因为快照会过早。它只适用于这种非常有限的简单情况。

(在关于此主题的WWDC视频中,Apple似乎暗示drop(_:toRowAt:)在某种程度上对应于. insertAtDestinationIndexPath的下降意图。但这是不是真的。您不能删除您即将插入的单元格的快照,因为您尚未插入它。再次,这就是占位符的用途。)