UITableViewDropCoordinator drop(_:toRowAt:) 不执行动画
UITableViewDropCoordinator drop(_:toRowAt:) doesn't perform animation
我有一个带放置委托的 UITableView (iOS 11)。在我实施
func tableView(_ tableView: UITableView,
performDropWith coord: UITableViewDropCoordinator) {
...我正在呼叫协调员的drop(_:toRowAt:)
。根据 Apple 的说法,这应该会导致拖动项目预览以动画方式精确覆盖单元格。但是没有发生任何事情。拖动项目预览只是缩小到位,就像我根本没有调用 drop(_:toRowAt:)
一样。
这个命令实际上做什么吗?
UITableViewDropCoordinator drop(_:toRowAt:)
确实有效,但仅在非常有限的情况下有效。以下是您必须了解的内容:
drop(_:toRowAt:)
必须在 performDropWith
实现的主要部分调用,而不是在异步 loadObject
调用中调用。所有 UITableViewDropCoordinator drop
命令都是如此。
drop(_:toRowAt:)
是这样工作的:
首先,它快照给定行的单元格。
然后,它将快照替换为拖动项预览,并动画快照以覆盖该行的单元格。
因此,drop(_:toRowAt:)
仅在非常有限的情况下有用。在您发出此命令时,如果有问题的单元格由于掉落而改变其外观,则该单元格必须 已经重新加载 — 因为快照将对应于给出 drop
命令时单元格的状态,并且您不希望单元格的 旧 外观以动画形式显示在预览之外。
因此,drop(_:toRowAt:)
不能与 loadObject
结合使用。 (这就是 placeholder 的用途。)它仅在本地拖动期间有用,您可以立即从拖动项的 localObject
中获取数据。而且它仅在您将 放到 现有单元格并 replace 的简单情况下有用。
示例:
guard let s = item.localObject as? String else {return}
// ... update model using s ...
tableView.reloadRows(at: [ip], with: .none)
coordinator.drop(item, toRowAt: ip)
请注意,我没有调用performBatchUpdates
。 drop(_:toRowAt:)
不能与 performBatchUpdates
结合使用,因为快照拍摄得太早了。它仅适用于这种非常有限的简单情况。
(在关于此主题的 WWDC 视频中,Apple 似乎暗示 drop(_:toRowAt:)
在某种程度上对应于 . insertAtDestinationIndexPath
的放置意图。但那是 不正确的。您不能删除要插入的单元格的快照,因为您还没有插入它。同样,这就是占位符的作用。)
我有一个带放置委托的 UITableView (iOS 11)。在我实施
func tableView(_ tableView: UITableView,
performDropWith coord: UITableViewDropCoordinator) {
...我正在呼叫协调员的drop(_:toRowAt:)
。根据 Apple 的说法,这应该会导致拖动项目预览以动画方式精确覆盖单元格。但是没有发生任何事情。拖动项目预览只是缩小到位,就像我根本没有调用 drop(_:toRowAt:)
一样。
这个命令实际上做什么吗?
UITableViewDropCoordinator drop(_:toRowAt:)
确实有效,但仅在非常有限的情况下有效。以下是您必须了解的内容:
drop(_:toRowAt:)
必须在performDropWith
实现的主要部分调用,而不是在异步loadObject
调用中调用。所有 UITableViewDropCoordinatordrop
命令都是如此。drop(_:toRowAt:)
是这样工作的:首先,它快照给定行的单元格。
然后,它将快照替换为拖动项预览,并动画快照以覆盖该行的单元格。
因此,drop(_:toRowAt:)
仅在非常有限的情况下有用。在您发出此命令时,如果有问题的单元格由于掉落而改变其外观,则该单元格必须 已经重新加载 — 因为快照将对应于给出 drop
命令时单元格的状态,并且您不希望单元格的 旧 外观以动画形式显示在预览之外。
因此,drop(_:toRowAt:)
不能与 loadObject
结合使用。 (这就是 placeholder 的用途。)它仅在本地拖动期间有用,您可以立即从拖动项的 localObject
中获取数据。而且它仅在您将 放到 现有单元格并 replace 的简单情况下有用。
示例:
guard let s = item.localObject as? String else {return}
// ... update model using s ...
tableView.reloadRows(at: [ip], with: .none)
coordinator.drop(item, toRowAt: ip)
请注意,我没有调用performBatchUpdates
。 drop(_:toRowAt:)
不能与 performBatchUpdates
结合使用,因为快照拍摄得太早了。它仅适用于这种非常有限的简单情况。
(在关于此主题的 WWDC 视频中,Apple 似乎暗示 drop(_:toRowAt:)
在某种程度上对应于 . insertAtDestinationIndexPath
的放置意图。但那是 不正确的。您不能删除要插入的单元格的快照,因为您还没有插入它。同样,这就是占位符的作用。)