2009-08-29 19 views
87

Tengo una vista útil que carga imágenes bastante grandes en cada celda y las alturas de las celdas varían según el tamaño de la imagen. El rendimiento de desplazamiento es decente, pero a veces puede ser desigual.Trucos para mejorar el rendimiento de desplazamiento de iPhone UITableView?

me encontré con estos consejos que encontré en el blog: FieryRobot

glassy-scrolling-with-uitableview

more-glassy-scrolling-with-uitableview

¿Alguien tiene algún consejo para mejorar el rendimiento del desplazamiento UITableView?

+0

Si necesita almacenar en caché las alturas de las celdas (que puede ser costoso de calcular y también se utilizan con frecuencia), he dado un ejemplo. Solo use esto si es adecuado en su aplicación. http://stackoverflow.com/questions/1371223/how-do-i-cache-something-for-a-tableview/10992748#10992748 –

Respuesta

151
  1. caché la altura de las filas (la vista de tabla puede solicitar esta frecuencia)
  2. crear una caché-menos recientemente utilizadas para las imágenes utilizadas en la tabla (e invalidar todas las entradas inactivas cuando recibir una advertencia de memoria)
  3. dibujar todo en el UITableViewCell 's drawRect: si es posible subvistas evitar a toda costa (o si requiere la funcionalidad estándar de accesibilidad, de la vista de contenido drawRect:)
  4. Haga sus UITableViewCell' s capa opaca (sa Me va a la vista de contenido si tiene uno)
  5. utilizar la funcionalidad reusableCellIdentifier según lo recomendado por el UITableView ejemplos y/o documentación
  6. Evitar gradientes/efectos gráficos complicados que no son precocido en UIImage s
+4

¡Además, las imágenes descargadas deberían reducirse al tamaño de la imagen antes de mostrarse en la celda! –

+3

Me gustaría agregar a esta respuesta una de mis experiencias de los últimos años: tener celdas transparentes probablemente nunca sea la causa del mal rendimiento del desplazamiento. Tenemos una aplicación con celdas MUY complicadas (más de 20 subvistas) y todo es transparente para mostrar el fondo. Con optimizaciones adecuadas, la transparencia no hace ninguna diferencia, incluso en un 3GS. En realidad, lo que más ralentizó las cosas fue la carga de la punta antes de que hubiera suficientes células para extraerlas de la vista de tabla. Si usa subvistas, solo asegúrese de tener jerarquías eficientes y no necesita usar drawRect. – Accatyyc

+0

@Accatyyc, parece que tengo el mismo problema. Hay un pequeño retraso cuando no hay suficientes celdas para dequear, cuando 3-4 celdas se quitan de la cola, el desplazamiento es suave.¿Hay alguna forma de precargar las celdas para que haya celdas para delectar y no cargar archivos NIB al desplazarse? – Tiois

40
  1. Si está subclassing UITableViewCell, no utilice una punta, escribirlo en código en su lugar. Es mucho más que cargar archivos Nib.
  2. Si está utilizando imágenes, asegúrese de que los estás almacenamiento en caché por lo que no tiene que cargar de archivo más de una vez para cada (si tiene la memoria - usted se sorprendería de lo toman mucho espacio).
  3. Hacer tantos elementos opacos como posible. Del mismo modo, intente no y use imágenes con transparencia.
+0

¿Dos votos negativos? Ooookay ... –

+3

no te preocupes ... que eran trolls. ¡gran respuesta! – Steav

+0

gracias por la punta del almacenamiento en caché de imágenes – pepsi

33

El desarrollador detrás de Tweetie ha escrito extensamente sobre esto y tiene algún código que demuestra cómo se hizo para esa aplicación. Básicamente, aboga por una vista personalizada por celda de la tabla, y dibujarla manualmente (en lugar de subcomprobar con Interface Builder, entre otras opciones).

fast-scrolling-in-tweetie-with-uitableview

Además, Apple ha actualizado sus propios código de ejemplo para TableView en sus tutoriales TableViewSuite (tal vez en respuesta a esto?)

TableViewSuite

+1

Esta es una solución increíble. Solo tengo curiosidad por cómo agregar un UIButton en el cellView? ¿Se está dibujando en el método drawRect? –

+1

@beno, su enlace parece roto (el primero) alguna posibilidad de poner nuestras manos en el artículo original? – apouche

+2

El artículo original se puede leer aquí: http://web.archive.org/web/20100922230053/http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/ – jverdi

1

# 1 asesino rendimiento para UITableView El desplazamiento es el dibujo sombras en cualquier capa de vista de celda, por lo que si el rendimiento de desplazamiento es importante, no haga sombras a menos que, básicamente, no disminuya la velocidad del hilo principal.

pensamos que esto tenía que decirse ya que ninguna de las respuestas aceptadas mencionaba las sombras y las capas. : +)

+3

si los problemas son las sombras agregue estas dos líneas de código y todo funciona perfectamente auto.capa.houldRasterize = YES; self.layer.rasterizationScale = UIScreen.mainScreen.scale; –

0

Cualquier problema con UITableView el rendimiento de desplazamiento puede resolverse utilizando las técnicas ya descritas en otras respuestas. Sin embargo, muchas veces el rendimiento lento es causado por algo intrínsecamente erróneo o repetitivo.

El hecho de que UITableView reutilice las celdas y el hecho de que cada celda pueda necesitar su propia imagen hace que la solución sea un poco compleja. De cómo se está resolviendo de la manera general, aquí resumo cosas que deben tenerse en cuenta:

  1. Cargar datos en el origen de datos - desde REST/base de datos. Este paso debe hacerse en segundo plano, utilizando finalmente dispatch_async junto con la cola de GCD.
  2. crear e inicializar los objetos del modelo de datos relevantes y ponerlos dentro de una matriz
  3. [tableView reloaddata]
  4. Dentro cellForRowAtIndexPath, incluyen código que establecerá los datos (texto) desde correcta modelo de datos de objetos de la matriz.
  5. Ahora, las imágenes también pueden tener forma de URL, por lo que este paso podría ser poco peculiar debido a la reutilización de células realizada por la vista de tabla. El corazón del hecho es cargar una vez más la imagen desde la memoria caché/URL del dispositivo usando la cola asincrónica, luego configurarla para corregir cell.image (cualquiera que sea su propiedad de imagen de celda).

Para evitar problemas, consulte este tutorial sobre lazy loading of images dentro de la vista de tabla.

Cuestiones relacionadas