Я использую IGListDiff
часть IGListKit фреймворка с открытым исходным кодом.
Это позволяет мне легче манипулировать, действовать и обновлять мои UICollectionView
и UICollectionViewCell
в моемПриложение.
Но я изо всех сил пытаюсь понять реализацию для moveItemAt
.
Действительно, я хотел бы иметь возможность переместить мой UICollectionViewCell
от длительного нажатия на них.Похоже, что IGListDiff
может с этим справиться (переместить - вставить и удалить).
Вот моя реализация moveItemAt
:
func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
let item = items.remove(at: sourceIndexPath.item)
items.insert(item, at: destinationIndexPath.item)
}
Ничего особенного, без этого я не могуне двигай мои клетки.Но оно также запускает обновление с IGListDiff
, потому что я изменяю источник данных, и мне кажется, что оно "удваивает" обновление моего UICollectionView
.
Я делаю remove
/ insert
в moveItemAt , но также и в моем методе execute при изменении источника данных:
extension UICollectionView {
func perform(result: DiffList.Result) {
if result.hasChanges {
self.performBatchUpdates({
if !result.deletes.isEmpty {
self.deleteItems(at: result.deletes.compactMap { IndexPath(row: $0, section: 0) })
}
if !result.inserts.isEmpty {
self.insertItems(at: result.inserts.compactMap { IndexPath(row: $0, section: 0) })
}
if !result.updates.isEmpty {
self.reloadItems(at: result.updates.compactMap { IndexPath(row: $0, section: 0) })
}
if !result.moves.isEmpty {
result.moves.forEach({ (index) in
let toIndexPath = IndexPath(row: index.to, section: 0)
self.moveItem(at: IndexPath(row: index.from, section: 0), to: toIndexPath)
})
}
})
}
}
}
Наконец, это мой источник данных, который запускает метод perform
для любой модификации:
private(set) var items = [AnyEquatableCellConfigurator]() {
didSet {
if oldValue.isEmpty {
self.collectionView.collectionViewLayout.invalidateLayout()
self.collectionView.reloadData()
} else {
let oldHashes = oldValue.map { $0.hash }
let newHashes = items.map { $0.hash }
let result = DiffList.diffing(oldArray: oldHashes, newArray: newHashes)
self.collectionView.perform(result: result)
}
}
}
Любая помощь от кого-то, кто уже реализовал moveItemAt
с алгоритмом DiffList
, будетоценили.