title: Incorrect animation when reordering tableview with new iOS 11 APIs
body: <p>I'm using the new drag and drop APIs on iOS 11 to reorder cells in a tableview inside the same app.</p>
  
  <p>Here's my implementation for <code>UITableViewDragDelegate</code> and <code>UITableViewDropDelegate</code>:</p>
  
  <pre><code>extension TasksViewController: UITableViewDragDelegate {
      func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -&gt; [UIDragItem] {
          let string = tasks[indexPath.row]
          guard let data = string.data(using: .utf8) else { return [] }
          let itemProvider = NSItemProvider(item: data as NSData, typeIdentifier: kUTTypePlainText as String)
          let item = UIDragItem(itemProvider: itemProvider)
          item.localObject = string
  
          return [item]
      }
  }
  
  extension TasksViewController: UITableViewDropDelegate {
      func tableView(_ tableView: UITableView, canHandle session: UIDropSession) -&gt; Bool {
          return true
      }
  
      func tableView(_ tableView: UITableView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -&gt; UITableViewDropProposal {
  
          if session.localDragSession != nil { // Drag originated from the same app.
              return UITableViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
          }
  
          return UITableViewDropProposal(operation: .cancel, intent: .unspecified)
      }
  
      func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
          guard let destinationIndexPath = coordinator.destinationIndexPath,
              let dragItem = coordinator.items.first?.dragItem,
              let task = dragItem.localObject as? String,
              let sourceIndexPath = coordinator.items.first?.sourceIndexPath else {
                  return
          }
  
          tableView.performBatchUpdates({
              self.tasks.remove(at: sourceIndexPath.row)
              self.tasks.insert(task, at: destinationIndexPath.row)
  
              tableView.deleteRows(at: [sourceIndexPath], with: .none)
              tableView.insertRows(at: [destinationIndexPath], with: .none)
          })
  
          coordinator.drop(dragItem, toRowAt: destinationIndexPath)
      }
  }
  </code></pre>
  
  <p>This works fine, but has a weird glitch. When the last cell is being dragged, as soon as it's dropped, it appears at the bottom of the tableview for a split second then disappears.</p>
  
  <p><a href="https://i.stack.imgur.com/zum2S.gif" rel="noreferrer"><img src="https://i.stack.imgur.com/zum2S.gif" alt="enter image description here"></a></p>
  
  <p>What am I missing here?</p>