Swift. Правильное изменение порядка нескольких элементов одновременно в collectionView с помощью перетаскивания - PullRequest
0 голосов
/ 27 апреля 2018

Я уже более 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

Кто-нибудь знает, как я могу подойти к решению этой проблемы.

1 Ответ

0 голосов
/ 08 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...