Я уже более 2 недель застрял на том, как перетаскивать несколько элементов одновременно в a collectionView (т.е. переупорядочивать несколько элементов в collectionView) с помощью нового перетаскивания ios11 & отказаться от протоколов. Я не могу заставить клетки последовательно переупорядочивать правильно.
Я пытался использовать заполнители, но, похоже, это больше подходит для удаленного перетаскивания в collectionView с асинхронной загрузкой данных.
Я пытался следовать инструкциям, приведенным в ответе в сообщении в блоге
https://hackernoon.com/drag-it-drop-it-in-collection-table-ios-11-6bd28795b313
где данные инструкции (как ответ в списке вопросов в конце поста) были следующими:
Изменение порядка нескольких элементов в одном представлении коллекции немного утомительно и требует обработки вручную.
Прежде всего, используйте UICollectionViewDropIntent в качестве .unspecified для .move UIDropOperation в UICollectionViewDropProposal при возврате из collectionView (_: dropSessionDidUpdate: withDestinationIndexPath :), т. Е.
func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal
{
return UICollectionViewDropProposal(operation: .move, intent: .unspecified)
}
Во-вторых, вам нужно обрабатывать вставку и удаление каждого элемента, который вы хотите переупорядочить в представлении коллекции явно. Пример: * +1021 *
let items = coordinator.items
var dIndexPath = destinationIndexPath
if dIndexPath.row >= collectionView.numberOfItems(inSection: 0)
{
dIndexPath.row = collectionView.numberOfItems(inSection: 0) - 1
}
var sourceIndexPaths = [IndexPath]()
var destinationIndexPaths = [IndexPath]()
for item in items
{
if let sourceIndexPath = item.sourceIndexPath
{
sourceIndexPaths.append(sourceIndexPath)
destinationIndexPaths.append(dIndexPath)
self.items2.remove(at: sourceIndexPath.row)
self.items2.insert(item.dragItem.localObject as! String, at: dIndexPath.row)
dIndexPath = IndexPath(row: dIndexPath.row + 1, section: 0)
}
}
collectionView.performBatchUpdates({
if collectionView === self.collectionView2
{
collectionView.deleteItems(at: sourceIndexPaths)
collectionView.insertItems(at: destinationIndexPaths)
}
})
Это частично работает, но только в том случае, если destinationIndexPath меньше, чем sourceIndexPaths всех элементов перетаскивания, т. Е. В collectionView из 5 элементов, объединение элементов в indexPaths 3 и 4 и вставка их в indexPath 1 работает и порядок правильный. Но это действительно работает (некоторые элементы удаляются, другие дублируются, а порядок неправильный), если я собираю элементы в indexPath 0 и 1 и пытаюсь отбросить их в indexPath 4. Это еще более сложно, если некоторые из собранных элементов имеют sourceIndexPaths меньше, чем targetIndexPath и другие имеют sourceIndexPath больше, чем destinationIndexPath.
Пример этого авторского проекта на
https://github.com/pgpt10/DragAndDrop-CollectionView
Кто-нибудь знает, как я могу подойти к решению этой проблемы.