Как получить indexPath нового центра UICollectionViewCell после его удаления? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть горизонтальный 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 ячейки представления коллекции в центре после того, как она была удалена?

1 Ответ

0 голосов
/ 07 декабря 2018

1) Почему бы вам не установить значение currentPost на ноль и пересчитать его, когда вам это действительно нужно, вместо того, как только вы удалили ячейку

2) Вы можете использовать UICollectionView.indexPathForItem (в точке: CGPoint), чтобы получить свой IndexPath.Это, вероятно, немного безопаснее.Я предполагаю, что точка, которую вы передадите, будет

CGPoint(x:self.postsCollectionView.contentOffset.x, y:0) 

Положение y будет зависеть от того, как вы разместите ячейку в представлении коллекции.

Если вам нужен результат немедленно.Вы знаете текущий индекс перед удалением.Если удаляемая ячейка имеет индекс, меньший или равный этому, то увеличьте текущий индекс, если индекс удаленной ячейки больше, не изменяйте его.

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