Использование 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 была ошибка, которая была исправлена в одном из последних обновлений.
Все это потраченное впустую время и усилия. Иногда нам действительно нужно больше верить в собственный код.