Tengo que hacer alguna operación cada vez que UICollectionView se ha cargado por completo, es decir, en ese momento se deben llamar todos los métodos de diseño / fuente de datos de UICollectionView. ¿¿Cómo sé eso?? ¿Existe algún método delegado para conocer el estado de carga de UICollectionView?
uicollectionview
delegates
reload
Jirune
fuente
fuente
[self.collectionView removeObserver:self forKeyPath:@"contentSize" context:NULL];
a-viewWillDisappear:animated:
también.Esto funcionó para mí:
Sintaxis de Swift 4:
fuente
reloadData
actualiza el,collectionView
por lo que se basa en sus métodos de origen de datos nuevamente ...performBatchUpdates
tiene un bloque de finalización adjunto, por lo que si ambos se realizan en el hilo principal, sabrá que cualquier código que se coloque en lugar de/// collection-view finished reload
se ejecutará con un nuevo y diseñadocollectionView
De hecho, es bastante simple.
Cuando, por ejemplo, llama al método reloadData de UICollectionView o al método invalidateLayout de su diseño, hace lo siguiente:
Por qué esto funciona:
El hilo principal (que es donde deberíamos hacer todas las actualizaciones de la interfaz de usuario) alberga la cola principal, que es de naturaleza serial, es decir, funciona en formato FIFO. Entonces, en el ejemplo anterior, se llama al primer bloque, que tiene nuestro
reloadData
método invocado, seguido de cualquier otra cosa en el segundo bloque.Ahora el hilo principal también se bloquea. Entonces, si
reloadData
tarda 3 segundos en ejecutarse, el procesamiento del segundo bloque será aplazado por esos 3 segundos.fuente
reloadData
ahora pone en cola la carga de las celdas en el hilo principal (incluso si se llama desde el hilo principal). Entonces, las celdas no se cargan (cellForRowAtIndexPath:
no se llaman) después de lasreloadData
devoluciones. Envolver el código que desea ejecutar después de que se carguen sus celdasdispatch_async(dispatch_get_main...
y llamarlo después de su llamada areloadData
logrará el resultado deseado.Solo para agregar a una excelente respuesta de @dezinezync:
Swift 3+
fuente
Hazlo asi:
fuente
Intente forzar un pase de diseño síncrono a través de layoutIfNeeded () justo después de la llamada reloadData (). Parece funcionar tanto para UICollectionView como para UITableView en iOS 12.
fuente
Como respondió dezinezync , lo que necesita es enviar a la cola principal un bloque de código después
reloadData
de unUITableView
oUICollectionView
, y luego este bloque se ejecutará después de que las celdas se retiren de la colaPara hacer esto más directo al usarlo, usaría una extensión como esta:
Puede también ser implementado a una
UITableView
, asífuente
Un enfoque diferente usando RxSwift / RxCocoa:
fuente
performBatchUpdates
no estaba funcionando en mi caso, este lo hace. ¡Salud!Esto funciona para mi:
fuente
Necesitaba realizar alguna acción en todas las celdas visibles cuando la vista de colección se carga antes de que sea visible para el usuario, usé:
Preste atención a que esto se llamará al desplazarse por la vista de colección, por lo que para evitar esta sobrecarga, agregué:
y en la acción misma:
La acción aún se realizará varias veces, como el número de celdas visibles en el estado inicial. pero en todas esas llamadas, tendrá la misma cantidad de celdas visibles (todas). Y la bandera booleana evitará que se ejecute nuevamente después de que el usuario comience a interactuar con la vista de colección.
fuente
Acabo de hacer lo siguiente para realizar cualquier cosa después de recargar la vista de colección. Puede utilizar este código incluso en la respuesta de la API.
fuente
La mejor solución que he encontrado hasta ahora es usar
CATransaction
para manejar la finalización.Rápido 5 :
fuente
Def haz esto:
Entonces llama así dentro de tu VC
¡Asegúrate de estar usando la subclase!
fuente
Este trabajo para mi:
fuente
Simplemente vuelva a cargar collectionView dentro de las actualizaciones por lotes y luego verifique en el bloque de finalización si está terminado o no con la ayuda del booleano "finish".
fuente
A continuación se muestra el único enfoque que funcionó para mí.
fuente
Así es como resolví el problema con Swift 3.0:
fuente
Prueba esto:
fuente
Puedes hacer así ...
fuente