ios uitableview ios7

ios - ¿Por qué UITableViewCell parpadea al cambiar de altura?



ios7 (6)

Creo que no deberías usar los métodos beginUpdate / endUpdates y realizar animaciones manualmente antes de llamar a reloadData. El estado final de las celdas (después de la animación) se define con la fuente de datos. Espero que esto te ayude.

Tengo un simple UITableView con UITableViewCells. Para la fila 0 en la vista de tabla, he establecido un color de fondo para la celda. Ahora, al tocar la fila 0, solo quiero que la fila se expanda. Para lograr esto, estoy usando la misma técnica que se describe here para cambiar la altura de la fila 0.

Ahora el problema es que la celda se expande y colapsa, pero con cada proceso hay un destello / destello feo en la celda. He intentado tanto startupdates / endupdates como también recargando solo esa fila usando [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone];

¿Qué está causando el parpadeo / flash al tocar? ¿Y cómo me deshago de él? Y sí, olvidé mencionar, he establecido el estilo de selección de la celda en ninguno. Así que eso no está causando esto.


He tenido un problema similar, con algunos culpables:

  • Asegúrese de que todas sus llamadas de tableview estén en el hilo principal.
  • Verifique la lógica de la altura de su celda, si hay inconsistencias podría causar problemas similares. Recuerde que las alturas de las celdas deben actualizarse a las alturas finales antes de pedirle a la tabla que vuelva a cargar filas.
  • Utilice un color de fondo de celda sólida. iOS 7 parece tener problemas si el color de fondo de la celda no es completamente opaco. (No pude encontrar una solución a esto mientras utilizaba un color bg no opaco. Sospecho que puede ser un error de iOS 7).

No estoy seguro de si este es el mismo problema que enfrenté hoy en la mañana, pero mi solución puede ayudar a alguien ...

Mis subvistas desaparecieron durante la recarga con animación ...

[self.tableView beginUpdates]; [self.tableView endUpdates];

o

[self.tableView reloadRowsAtIndexPaths:]

Finalmente, descubrí que modifiqué los marcos de las subvistas de la celda para calcular los tamaños adecuados ... Lo cambié y comencé a usar otras vistas para los cálculos y resolví mi problema.

En lugar de:

self.leftLabel.frame = CGRectMake(0, 0, innerWidth, CGFLOAT_MAX); [self.leftLabel sizeToFit];

Hice cálculos de esta manera:

UILabel * tmpLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, innerWidth, CGFLOAT_MAX)]; tmpLabel.numberOfLines = self.leftLabel.numberOfLines; tmpLabel.attributedText = self.leftLabel.attributedText; [tmpLabel sizeToFit]; self.leftLabel.frame = tmpLabel.frame;


Si no desea que la animación pare de parpadear, puede usar la siguiente solución:

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

El fragmento de código anterior no tendrá ninguna animación en las celdas mientras se vuelve a cargar la celda.


Tuve el mismo problema al usar un color de fondo no opaco de la celda. La solución es usar backgroundView propiedad backgroundView , en lugar de backgroundColor :

UIView *backgroundView = [[UIView alloc] initWithFrame:cell.frame]; backgroundView.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.1f]; cell.backgroundView = backgroundView; cell.backgroundColor = [UIColor clearColor];


Yo esperaría el flash porque no ha elegido ninguna animación, es decir, UITableViewRowAnimationNone . Prueba la animación de fundido.

[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]];

Si eso todavía no se ve bien, intente animar todas las filas visibles:

[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationFade]];