Evita que las vistas salten desde la esquina superior izquierda durante las animaciones en iOS

A veces, cuando las celdas de vista de tabla aparecen en animaciones, e, g, -[UIView viewWillAppear:animated] con -[UITableView reloadData] , el contenido dentro de ellas -[UITableView reloadData] desde la esquina superior izquierda (0, 0) hasta los cuadros finales. Este problema también ocurre en otras animaciones de vista. En los viejos times, este problema no existía. En una actualización de iOS, apareció el problema pero las posiciones iniciales fueron aleatorias, generalmente fuera de la pantalla. En otra actualización de iOS, el problema se volvió determinista con la position inicial siendo (0,0).

He intentado [tableView layoutIfNeeded] , [tableView.layer displayIfNeeded] después de [tableView reloadData] y los de las celdas en cellForRowAtIndexPath . ¿Qué me estaba perdiendo?

Cargué un proyecto de muestra https://github.com/keithyipkw/ios-animation-bug . Para reproducir de manera confiable el problema, establezca un punto de interrupción en viewWillAppear, antes de reloadData. Tire hacia abajo la pantalla para mostrar el centro de hoy. Corre después del hoy centro totalmente visible.

capturas de pantalla

También tengo el mismo problema, esto ocurre cuando el televisor muestra las celdas por primera vez.
Esto se debe al hecho de que las celdas se crean con el tamaño inicial del prototipo en el guión gráfico y, posteriormente, networkingimensionaron el tamaño del ancho de la TV. Para evitar eso en cellForRowAtIndexPath , establezco el ancho de la celda para que sea del tamaño del televisor y forzo una actualización de layout automático en la celda, para que todos los elementos ya se ajusten a ese tamaño.
Todavía no encontré una solución real, esto es más un truco, espero que alguien más dé una respuesta sobre tu pregunta.

La solución es usar dequeue e init cells con identificadores de reutilización. Todavía funciona cuando aparece una celda la primera vez. La magia es dequeue e init con el mismo identificador no nulo.

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; }