ios uitableview uicollectionview reloaddata

ios - UICollection view reloadData cause recreate visible cell



uitableview uicollectionview (5)

Al llamar a reloadData en una tabla o en una vista de colección, se volverá a crear (se eliminará de la cola si es posible) todas las celdas (visibles) y se actualizará la información sobre el recuento de filas / elementos y la altura del contenido de la vista. Entonces, siempre verás un ''parpadeo'' porque está animado.

Esto es por diseño para informar al usuario que todo se acaba de actualizar ...

Para evitar la animación, no llame a reloadData . En su lugar, use visibleCells para obtener todas las celdas que existen actualmente en la pantalla y actualizar sus contenidos directamente.

Cuando llamo al método reloadData de UICollectionView, hace que todas las celdas visibles parpadeen. Descubrí que la razón de esto es la recreación de todas las celdas visibles, mientras que UITableView devuelve una celda visible en - tableView: cellForRowAtIndexPath: método después de volver a cargar los datos.

Entonces, ¿cómo puedo evitar la recreación de celdas visibles en UICollectionView?


Puede probar https://github.com/ba01ei/PSTImprovedCollectionView

Con esta vista de colección, cuando llama a reloadData, si una celda aún está visible, la misma celda será devuelta desde la cola (entonces puede verificar el modelo de datos adjunto a la celda y decidir si volver a renderizar)


Simplemente puede crear su propio diseño de flujo y establecer alfa en el atributo de diseño inicial, por ejemplo,

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

Es necesario porque, de forma predeterminada, alfa es 0, y si las celdas se recrean, verá parpadear.


Versión rápida:

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


reloadData volver a cargar las celdas visibles, lo que no causará el flash visto durante reloadData :

[myCollectionView reloadItemsAtIndexPaths:[myCollectionView indexPathsForVisibleItems]];