Повторная перезагрузка UICollectionData вызывает воссоздание видимой ячейки

Когда я вызываю метод reloadData UICollectionView, он вызывает мигание всех видимых ячеек. Я обнаружил, что причиной этого является восстановление всех видимых ячеек, в то время как UITableView возвращает видимую ячейку в - tableView: cellForRowAtIndexPath: после перезагрузки данных.

Итак, как я могу избежать воссоздания видимых ячеек в UICollectionView.

Ответ 1

Вам нужно перезагрузить видимые ячейки, которые не будут вызывать вспышку во время reloadData:

[myCollectionView reloadItemsAtIndexPaths:[myCollectionView indexPathsForVisibleItems]];

Ответ 2

Вызов reloadData в таблице или в представлении коллекции будет воссоздавать (по возможности удалить) все (видимые) ячейки и обновить информацию о количестве строк/элементов и высоте содержимого представления. Таким образом, вы всегда будете видеть "мигание", потому что оно анимировано.

Это по дизайну, чтобы сообщить пользователю, что все было просто обновлено...

Чтобы избежать анимации, не вызывайте reloadData. Вместо этого используйте visibleCells, чтобы получить все ячейки, которые в настоящее время существуют на экране, и напрямую обновлять их содержимое.

Ответ 3

Быстрая версия:

if let indexPath = collectionView?.indexPathsForVisibleItems {
    collectionView?.reloadItems(at: indexPath)
}

Ответ 4

Вы можете просто создать свой собственный макет потока и установить альфа в начальный атрибут макета, например,

class MyFlowLayout: UICollectionViewFlowLayout {

    override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        let attr = layoutAttributesForItem(at: itemIndexPath)
        attr?.alpha = 1
        return attr
    }
}

Это необходимо, потому что по умолчанию альфа равна 0, а если клетки воссоздаются - вы видите мигание.

Ответ 5

Вы можете попробовать https://github.com/ba01ei/PSTImprovedCollectionView

В этом представлении коллекции, когда вы вызываете reloadData, если ячейка все еще видна, одна и та же ячейка будет возвращена из очереди (тогда вы можете проверить модель данных, прикрепленную к ячейке, и решить, следует ли ее повторно отображать)

Ответ 6

попробуйте следующее:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
     [weakSelf.collectionView reloadData];
});