tutorial example collection ios uicollectionview

ios - example - contentSize no se actualiza después de llamar a reloadData en UICollectionView



uicollectionview swift 4 (4)

Edición: acabo de probar esto y, de hecho, cuando los datos cambien, mi solución original se bloqueará con lo siguiente:

"Actualización no válida: número de elementos no válido en la sección 0. El número de elementos contenidos en una sección existente después de la actualización (7) debe ser igual al número de elementos contenidos en esa sección antes de la actualización (100), más o menos número de elementos insertados o eliminados de esa sección (0 insertados, 0 eliminados) y más o menos el número de elementos movidos dentro o fuera de esa sección (0 movidos hacia adentro, 0 movidos hacia afuera) ".

La forma correcta de manejar esto es calcular las inserciones, eliminaciones y movimientos cada vez que cambia la fuente de datos y usar performBatchUpdates alrededor de ellos cuando lo hace. Por ejemplo, si se agregan dos elementos al final de una matriz que es el origen de datos, este sería el código:

NSArray *indexPaths = @[indexPath1, indexPath2]; [self.collectionView performBatchUpdates:^() { [self.collectionView insertItemsAtIndexPaths:indexPaths]; } completion:^(BOOL finished) { // TODO: Whatever it is you want to do now that you know the contentSize. }];

A continuación se muestra la solución editada de mi respuesta original proporcionada por Kernix, que no creo que esté garantizada para funcionar.

Intente realizarBatchUpdates: finalización: en UICollectionView. Debe tener acceso a las propiedades actualizadas en el bloque de finalización. Se vería así:

[self.collectionView reloadData]; [self.collectionView performBatchUpdates:^() { } completion:^(BOOL finished) { // TODO: Whatever it is you want to do now that you know the contentSize. }];

¿Alguien sabe por qué contentSize no se actualiza inmediatamente después de llamar a reloadData en UICollectionView?

Si necesitas conocer el contenido, el mejor trabajo que he encontrado es el siguiente:

[_collectionView reloadData]; double delayInSeconds = 0.0001; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^(void) { // TODO: Whatever it is you want to do now that you know the contentSize. });

Obviamente, este es un hack bastante quebradizo que hace suposiciones sobre la implementación de Apple, pero hasta ahora ha demostrado que funciona de manera bastante confiable.

¿Alguien tiene alguna otra solución o conocimiento sobre por qué sucede esto? Estoy debatiendo el envío de un radar porque no entiendo por qué no pueden calcular contentSize en el mismo ciclo de ejecución. Así es como UITableView ha trabajado para toda su implementación.

EDITAR: esta pregunta se usa para hacer referencia al método setContentOffset dentro del bloque porque quiero desplazar la vista de colección en mi aplicación. He eliminado la llamada al método porque las respuestas de las personas se centraron en por qué no estaba usando scrollToItemAtIndexPath dentro de por qué no se está actualizando contentSize.


Esto funcionó para mí:

[self.collectionView.collectionViewLayout invalidateLayout]; [self.collectionView.collectionViewLayout prepareLayout];


Llame a prepareLayout primero, y luego obtendrá contentSize correcto:

[self.collectionView.collectionViewLayout prepareLayout];


Para obtener el tamaño del contenido después de la recarga, intente llamar a collectionViewContentSize del objeto de diseño. Esto funciona para mi.