2012-05-01 10 views
9

Tengo un UITableViewCell personalizado que consiste en un UIImageView y un UILabel. La celda mide 320x104px y el imageView ocupa toda el área con la etiqueta al frente. Solo hay 8 celdasUITableViewCell personalizado con UIImageView grande que causa desplazamiento de desplazamiento

en ViewDidLoad Estoy creando todas las imágenes necesarias por adelantado y las guardo en un diccionario en las dimensiones correctas.

Cuando desplazo el UITableView, hay un retraso notable cada vez que se encuentra una nueva celda. Esto no tiene sentido para mí ya que la imagen que está utilizando ya está creada y en la memoria caché. Todo lo que le pido a la celda es que su UIImageView represente la imagen.

estoy usando una celda de medida con su punto de vista en un xib y configuración de mi UITableView usarlo con:

[self.tableView registerNib: [UINib nibWithNibName: @ "ActsCell" paquete: nil] forCellReuseIdentifier: myIdentifier];

creación de células y configuración:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString* reuseIdentifier = @"ActsCell"; 
    ActsCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    // Configure the cell... 
    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 

- (void)configureCell:(ActsCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    Act* act = [self.acts objectAtIndex:indexPath.row]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.title.text = act.name; 
    cell.imageView.image = [self.imageCache objectForKey:act.uid]; 
} 

qué podría estar causando el retraso? No parece ser beneficioso tratar de hacer nada Async ya que todo el trabajo que requiere mucho tiempo se realiza.

+0

Puedo pensar en dos cosas. Una es que el proceso de dequeueing falla porque no configura el 'reusableIdentifier' correctamente. El otro es el tamaño de las imágenes. A pesar de que las imágenes están cargadas, CG necesita procesar los datos de la imagen antes de mostrarlos, lo que puede implicar operaciones costosas como escalar, componer, etc. – Lvsti

+0

@Lvsti ¿Puede explicar cómo no configuro el reuseIdentifier correctamente? – Undistraction

+0

tienes razón, probablemente ese no sea el caso, de lo contrario no recuperarás ninguna célula cuando dequeueing ... – Lvsti

Respuesta

28

¿Carga imágenes de archivos locales por casualidad?

Al usar instrumentos, he encontrado que hay algún mecanismo de carga diferido en UIImage - los datos de la imagen real se descomprimieron de PNG solo en la etapa de representación en el hilo principal que causó el retraso durante el desplazamiento.

Así que, después de la carga de UIImage con -initWithContentsOfFile: método, he añadido código para representar los contenidos de esta imagen con el contexto fuera de la pantalla, guarda ese contexto como el nuevo UIImage y lo utilizó para UIImageView en UITableViewCell, esto hizo que el desplazamiento para ser suave y agradable a la vista de nuevo.

En caso de referencia no es el simple código que estoy usando para forzar la lectura del contenido de la imagen en hilo separado (usando ARC):

UIImage *productImage = [[UIImage alloc] initWithContentsOfFile:path]; 

CGSize imageSize = productImage.size; 
UIGraphicsBeginImageContext(imageSize); 
[productImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)]; 
productImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

y creo que la superficie del UIImage creado de tal manera estará en el formato admitido adecuado para la representación, que también descargará el trabajo necesario para representarlo en el hilo principal.

EDITAR: Los documentos para UIGraphicsGetImageFromCurrentImageContext() dicen que solo debe usarse desde el hilo principal, pero al buscar en la red o en SO, muestra que a partir de iOS 4, los métodos UIGraphics.. se volvieron seguros.

+5

Esto fue absolutamente invaluable para mí. He estado sufriendo de desplazamiento entrecortado en un UICollectionView con UIImageViews en cada celda para mostrar una foto. Intenté * muchas * soluciones diferentes, pero la única forma de acercarme a 60FPS fue extremadamente hacky. La mayoría de las soluciones que probé implicaban la carga previa de una NSCache de UIImages utilizando imageWithContentsOfFile, pero hiciera lo que hiciera, siempre había un pequeño salto a medida que aparecían nuevas células en la pantalla hasta que implementé el código anterior. Como dices, debe existir algún tipo de mecanismo de carga diferida integrado en imageWithContentsOfFile que no se menciona en los documentos. – alistairholt

+0

Esto funciona para mí, es mucho más sencillo almacenar el UIImage en lugar de los datos descargados y luego convertirlos a UIImage cada vez que se usen. Muchas gracias. – Envil

+0

Estado buscando tanto tiempo para la causa lenta/entrecortada. Usted señor es un héroe – user1838169

Cuestiones relacionadas