title: Using a UITableViewDropCoordinator to animate drops via the dropDelegate with a diffable data source
body: <p>In iOS 11 Apple introduced native drag and drop to TableViews which provided specifc animations for common drag and drop interactions.  Assuming you had returned the correct UIDropProposal it would easily animate a reordering drop in a table view</p>
  <pre><code>func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
    // usual code to handle drop, get dragItem, etc
    // ....
  
    // update the dataModel to reflect the change
    self?.model.updateDataSourceForDrag(from: sourceIndexPath, to: destinationIndexPath)
  
   // perform the drop animation with the drop coordinator
   coordinator.drop(dragItem, toRowAt: destinationIndexPath)
  }
  </code></pre>
  <p>and this would nicely animate the insertion of the dropped item into the tableView into the gap it was hovering over.</p>
  <p>Fast forward to iOS 13+ and the use of diffable data source and I can find no reference to using the dropCoordinator with snapshots in the Apple documentation, and there has been no update to the guides, tutorials, or WWDC videos to show how to combine the two sets of APIs.</p>
  <p>The drop controller will correctly &quot;manage&quot; the tableView during the drag operation and move the cells around to show the gap where dragged cell would drop, but it won't animate the actual drop with <code>coordinator.drop(dragItem, toRowAt: destinationIndexPath)</code>.</p>
  <p>The workaround I have currently is to manually update and then apply the snapshot:</p>
  <pre><code>DispatchQueue.main.async {
    var snapshot = self?.dataSource.snapshot()
    if destinationIndexPath.row &gt; sourceIndexPath.row {
       snapshot?.moveItem((self?.dataSource.itemIdentifier(for: sourceIndexPath))!, afterItem: (self?.dataSource.itemIdentifier(for: destinationIndexPath))!)
    } else {
       snapshot?.moveItem((self?.dataSource.itemIdentifier(for: sourceIndexPath))!, beforeItem: (self?.dataSource.itemIdentifier(for: destinationIndexPath))!)
    }
    self?.dataSource.apply(snapshot!, animatingDifferences: false)
  }
  </code></pre>
  <p>This works to a degree, but it doesn't integrate with the drop controller animation.  So I can get the animation providing drop gaps in the tableView while I drag, but as soon as I drop it animates the cell move from its original indexPath rather than from the animated dropped items (as I'd expect for this workaround) which is all rather clunky.</p>
  <p>That the dropCoordinator can adapt the tableView to animate the drag suggests it should be able to do animate the drop too, but I can find no way to achieve this.</p>
  <p>Any experience with this would be gratefully received (before I give up and revert the code back to the older UITableViewDataSource methods).</p>