Использование UITableViewDropCoordinator для анимации капель с помощью dropDelegate с источником данных, доступным для просмотра.

В iOS 11 Apple представила собственное перетаскивание для TableViews, которое предоставляло специфические анимации для обычных взаимодействий перетаскивания. Предполагая, что вы вернули правильный UIDropProposal, он легко анимировал бы переупорядочение падения в табличном представлении.

      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)
}

и это красиво анимировало бы вставку перетаскиваемого элемента в tableView в промежуток, над которым он зависал.

Перенесемся к iOS 13+ и использованию источника данных, и я не могу найти упоминания об использовании dropCoordinator со снимками в документации Apple, а также не было обновлений руководств, руководств или видеороликов WWDC, чтобы показать, как комбинировать два набора API.

Контроллер перетаскивания будет правильно «управлять» tableView во время операции перетаскивания и перемещать ячейки, чтобы показать промежуток, в котором перетаскиваемая ячейка могла бы упасть, но он не будет анимировать фактическое падение с помощью coordinator.drop(dragItem, toRowAt: destinationIndexPath).

В настоящее время у меня есть обходной путь - обновить вручную, а затем применить снимок:

      DispatchQueue.main.async {
  var snapshot = self?.dataSource.snapshot()
  if destinationIndexPath.row > 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)
}

В определенной степени это работает, но не интегрируется с анимацией контроллера перетаскивания. Таким образом, я могу получить анимацию, обеспечивающую пропуски в tableView, пока я перетаскиваю, но как только я отбрасываю, она анимирует перемещение ячейки из исходного indexPath, а не из анимированных отброшенных элементов (как я ожидал для этого обходного пути), который все довольно неуклюже.

То, что dropCoordinator может адаптировать tableView для анимации перетаскивания, предполагает, что он также должен иметь возможность анимировать перетаскивание, но я не могу найти способа добиться этого.

Любой опыт с этим будет с благодарностью получен (прежде чем я откажусь и верну код обратно к более старым методам UITableViewDataSource).

1 ответ

Анимация падения теперь работает, как и ожидалось, в коде, который не изменялся в течение нескольких месяцев.

Должно быть, в iOS14 и ранних версиях iOS15 была ошибка, которая была исправлена ​​в одном из последних обновлений.

Все это потраченное впустую время и усилия. Иногда нам действительно нужно больше верить в собственный код.