У меня есть горизонтальный CollectionView, называемый postsCollectionView, где каждый имеет ширину экрана.В настоящее время я вычисляю indexPath currentPost с помощью:
let currentPostIndex = Int(self.postsCollectionView.contentOffset.x / self.postsCollectionView.frame.size.width)
let currentPostIndexPath = IndexPath(row: currentPostIndex, section: 0)
Когда сообщение удаляется, и я сбрасываю "currentPost", у меня есть этот хакерский метод в моем контроллере вида:
func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if (postsFetchedResultsController.fetchedObjects?.count)! > 0 {
print(postsCollectionView.indexPathsForVisibleItems,postsCollectionView.contentOffset.x) //prints [],375.0
//HACK
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { // change 2 to desired number of seconds
let currentPostIndex = Int(self.postsCollectionView.contentOffset.x / self.postsCollectionView.frame.size.width)
let currentPostIndexPath = IndexPath(row: currentPostIndex, section: 0)
self.currentPost = self.postsFetchedResultsController.object(at: currentPostIndexPath)
}
} else {
print("no items left")
}
}
По существу, существует NSFetchedResultsController, который вызывает метод deleteItem collectionView при изменении источника данных.Я использую обратный вызов didEndDisplaying ячейка в попытке - когда ячейка была полностью удалена, установите self.currentPost для отображаемого сообщения, которое заняло его место.
Проблема в том, что этот обратный вызов вызывается, я думаю, когда ячейка удалена, но анимация еще не завершена, поэтому она все еще смещена на 375 (ширина экрана), поэтому она вычисляет текущий индексный путь в1, хотя это должно быть 0, потому что теперь в collectionView есть только 1 сообщение.
Есть ли способ дождаться окончания анимации?Или есть лучший способ вычислить новый indexPath ячейки представления коллекции в центре после того, как она была удалена?