El contenido de UITableViewCell parpadea mientras se vuelven a cargar las celdas individualmente

Tengo una vista de tabla vinculada a un NSFetchedResultController (es decir, cargar datos y también hacer un seguimiento de los cambios en los datos está vinculado al FRC)

No AutoLayout en mis células (debido a la enorme caída de performance que presenta en iOS 8). Estoy distribuyendo el contenido de mis celdas manualmente en celdas (usando -(void)layoutSubviews ). Además, la altura de las filas se calcula según el contenido y se almacena en caching / se invalida correctamente.

Si alguna condición relacionada con mis datos cambia, las celdas relacionadas se actualizan individualmente (con el set -(void)controllerWillChangeContent:... through -(void)controllerDidChangeContent:... delegate methods implemented) la animation para las actualizaciones de fila es: UITableViewRowAnimationNone

El problema aquí es que mis células tienen backgrounds transparentes y puedo ver algunos ruidos visuales (muy probablemente la célula real se estira verticalmente, no puedo asegurarlo porque son realmente transitorios y de corta duración) durante [self.tableView reloadRowsAtIndexPaths:...]; .

¡He intentado muchas cosas en vano!

Aquí están las cosas que he intentado que no funcionan:

  • Implementación -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath , devolviendo el valor exacto para las alturas estimadas.
  • configuration self.tableView.rowHeight=UITableViewAutomaticDimension; , ayuda mucho pero no lo soluciona.
  • Deshabilitar la animation en [self.tableView beginUpdates]; y habilitando después de [self.tableView endUpdates];
  • Eliminando todas las subvenciones del contenido de las celdas en -(void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

Cosas que ayudan un poco:

  • Hacer celdas opacas (es decir, establecer un color de background para celdas). Extrañamente, los artefactos parecen estar bajo el contenido real de la celda.

Más información

  • La mayoría del contenido de mis celdas son nodos de AsyncDisplayKit (ASTextNode, ASImageNode), pero replacelos con sus contrapartes UIKit no resuelve el problema.
  • Todas mis actualizaciones visuales están sucediendo en el hilo principal. Siempre me aseguro de eso.
  • El problema no es omnipresente, pero existe más a menudo que no. Parecen suceder más después de que se inserten las segundas células si ayuda.
  • -(void)layoutSubviews session del método -(void)layoutSubviews de -(void)layoutSubviews en mis celdas muestran que las celdas con condición de actualización se vuelven a cargar 3 veces seguidas después de cada actualización, en contraste con otras celdas que se actualizan solo una vez. No estoy forzando ningún [cell layoutIfNeeded]; o [cell setNeedsLayout]; en cualquier sitio.
  • Recarga de la vista de tabla completa utilizando [self.tableView reloadData]; No es una opción para mí.

Más información adicional

  • ¡Hacer que las células sean opacas lleva a que las células se extiendan solo una vez! ¡extraño!

Al final, lamento no poder compartir ningún código real, ya que no es un proyecto de testing y la complejidad de las implementaciones hace que cualquier código compartido sea inútil a less que se lo comprenda en su set.

Gracias por tu time.

También tuve el mismo problema de parpadear UITableViewCell al usar reloadRowsAtIndexPath, así que lo que hice fue –

  [UIView setAnimationsEnabled:NO]; [self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates]; [UIView setAnimationsEnabled:YES]; 

El fragment anterior no tendrá animation en las celdas mientras se vuelve a cargar la celda.

Si alguien encontró el mismo problema:

Si está calculando la altura de la celda y sus elementos y depende de NSIndexPath para consultar cualquier dato o condición, compruebe siempre que su ruta de índice sea válida (no es nil ). La mayoría de los methods UITableView que devuelven la ruta del índice (por ejemplo -(NSIndexPath *)indexPathForCell:.. , etc.) pueden devolver valores nil y le dispararán en una espiral que depura las vistas.

En mi caso, tenía un método para determinar si mi celda debería tener un encabezado, y para eso comprobé si es la primera celda o si una condición ha cambiado desde la celda anterior. el problema era indexPath.row == 0 es verdadero incluso si la ruta del índice es realmente nil (es un problema conceptual en Objective-C donde nil es 0). así que por un breve momento mis células pensarían que tiene un encabezado.

Me siento un poco estúpido al no search paths de índice nil , pero creo que compartirlo podría ayudar a alguien algún día.

Rápidamente estoy usando esto y disminuye el parpadeo

 let visibleIndexs = self.ContentTableview.indexPathsForVisibleRows! as NSArray print(visibleIndexs) for indx in visibleIndexs { if self.imgDownloadedIndexs!.containsObject(indx) { UIView.setAnimationsEnabled(false) self.ContentTableview.beginUpdates() self.ContentTableview.reloadRowsAtIndexPaths([indx as! NSIndexPath], withRowAnimation:.None) self.ContentTableview.endUpdates() UIView.setAnimationsEnabled(true) self.imgDownloadedIndexs?.removeObject(indx) } 
    Intereting Posts