ios - UITableViewDropCoordinator 下降(_ :toRowAt:) doesn't perform animation

标签 ios uitableview drag-and-drop ios11

我有一个带有放置委托(delegate)的 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:) 的工作方式如下:

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

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

因此,drop(_:toRowAt:) 仅在非常有限的情况下有用。在您发出此命令时,如果所讨论的单元格因掉落而改变其外观,则该单元格必须已经重新加载——因为快照将对应于给出 drop 命令时的单元格,并且您不希望单元格的外观以动画形式显示在预览之外。

因此,drop(_:toRowAt:) 在与 loadObject 的连接中没有用处。 (这就是 placeholder 的用途。)它仅在本地拖动期间有用,您可以立即从拖动项的 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 的放置意图。但那是不对。您不能删除要插入的单元格的快照,因为您还没有插入它。同样,这就是占位符的用途。)

关于ios - UITableViewDropCoordinator 下降(_ :toRowAt:) doesn't perform animation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46437601/

相关文章:

ios - 在 NSDictionary 中传递 NSDate 并转换为 NSData 以进行 jsondata 修复

iOS Swift 2.0 - AvAudioPlayer 没有播放任何声音

android - 如何将实时、不断更新的数据从 REST API 发送到移动应用程序?

ios - 从一个 tableView 创建不同的 segue

ios - Swift 3 - 基于字符串变量的过滤数组

javascript - 使用jquery TableDnD插件拖放表格行如何使某些ros不可拖动并保存排序的行?

ios - Crashlytics 是否会生成有关低内存应用程序终止 (iOS) 的崩溃报告?

ios - 如何使用后退按钮更新 tableviewcell?

javascript - React/AntDesign 如何使行可拖动? (表格拖动排序)

c++ - 如何防止特定的 QTreeView 分支被拖动?