¿Cómo mejorar el performance de UICollectionView? Deje que se desplace suavemente

Estoy desarrollando una aplicación para iOS que usa UICollectionView para lograr un module como una aplicación de calendar normal. El color de background de la celda de la date cambia de acuerdo con la date (Esto no es importante). La celda se reutiliza con el método dequeueReusableCellWithReuseIdentifier. Sin embargo, el calendar es muy flojo cuando lo enrolla. Busqué en Google la pregunta y la busqué en stackoverflow todo el día, pero no pude encontrar la respuesta perfecta.

Muchas cosas pueden causar un performance de desplazamiento lento. Es posible que tenga que networkingucirlo y publicar un código. Un par de errores comunes:

  • Volver a crear todas las subvistas al cargar datos en una celda. Debería crear subvistas una vez por instancia de celda, y simplemente borrar su estado en prepareForReuse
  • Eliminando y volviendo a agregar restricciones de reproducción automática al reutilizar las celdas. Si necesita modificar las restricciones de autolayout en function de los datos, es mucho, mucho más rápido modificar un valor constante en una restricción existente que eliminarlo y volver a agregarlo

Lo primero que debe comprobar es que sus células se están reutilizando correctamente. Si no, hay una sobrecarga significativa (especialmente para celdas complejas) cuando se crean instancias de un xib.

Una manera fácil de hacerlo es implementar el método -prepareForReuse en su subclass de celda y NSLog un post. Debería ver este método disparado cada vez que una celda se desplaza fuera de la pantalla. Si no se dispara, sus células no se reutilizan.

Algunas personas han informado de un problema similar, posiblemente un error en iOS 7. Vea aquí , aquí y aquí .

A menudo ayuda a garantizar que todas las celdas sean opacas. set shouldRasterize a YES en la capa de la celda (no olvide establecer la rasterizationScale).

También noté que las operaciones de NSDate pueden ser bastante lentas. Así que si haces algo con un ciclo y aumentas el nsdate cada vez con un día, también podrías get un aumento en el performance simplemente haciendo un bucle desde i = 1; i <= numberOfDaysInTheMonth.