ios uitableview ios7 heightforrowatindexpath
Demostración de altura de fila estimada

ios - estimatedHeightForRowAtIndexPath de hecho puede cambiar la altura final "correcta" de una fila?



uitableview ios7 (2)

Acabo de descubrir un problema asombroso o un comportamiento contrario a la intuición cuando uso el valor estimadoHeightForRowAtIndexPath

(1) Mi mesa tiene alturas de fila muy diferentes. Los resultados finales pueden oscilar entre 111 y aproximadamente 400.

(2) Calculo absolutamente perfectamente cada altura de fila. Los tengo a mano en una matriz, es decir, en la memoria caché.

{Tenga en cuenta que esto es exactamente lo que, aparentemente, los ingenieros de Apple recomiendan ahora ... ejemplo, punto 5 .. Uso del diseño automático en UITableView para diseños dinámicos de celdas y alturas de fila variables }

(3) Cuando heightForRowAtIndexPath solicita una altura, le doy la altura correcta.

(4) Cuando construyo la celda, de hecho, la construyo exactamente a la altura correcta (como en (2) y (3)).

{Nota: por supuesto, es iOS el que finalmente mide la altura de una celda, no "yo".}

ESTO TODO FUNCIONA PERFECTAMENTE.

es decir, cada celda está construida por iOS a la altura exacta dada en heightForRowAtIndexPath.

Ahora, agrego el código ...

-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return 120; }

DE HECHO, LA MESA NO FUNCIONA MÁS .................. ¡LAS ALTURAS DE FILA SE HACEN ALEATORIAS!

¿ALGUIEN HA VISTO ESTE COMPORTAMIENTO INCREÍBLE?

Hice varias pruebas para tratar de determinar la relación de qué demonios calcula HeightForRowAtIndexPath. Al principio, pensé que podría proporcionar un límite inferior en la altura. Entonces, 150 ... incluso mis celdas más pequeñas serían incorrectamente de 150 de alto. Pero ese no es el caso.

Creo que podría estar haciendo algo como esto: supongamos que su valor estimado de HeightForRowAtIndexPath es 150. Algunas veces usa 150 para las filas que (de hecho () demuestran ser de ese tamaño o menos, pero a veces se aplica al tamaño real de heightForRowAtIndexPath.

Por otro lado, si pones un valor para estimateHeightForRowAtIndexPath que es más pequeño de lo que realmente existirá (digamos 100 en mi ejemplo), casi "completamente no funciona" solo obtienes lo que solo puede parecer alturas aleatorias en las celdas.

las celdas muy altas parecen funcionar correctamente, tal vez algo como "si la altura desde heightForRowAtIndexPath es el doble de la estimada, entonces usa la altura real"

Para ser claros, parece que nunca hace que una celda sea demasiado pequeña, pero a menudo los hace demasiado grandes.

Para ser claros, no estoy usando el autolayout, es el tipo de celda que solo tienes que construir. (Me temo que no tengo idea de cómo va esto con el autolayout.) Esto es solo Xcode5 / iOS7 +.


Respuesta actualizada

Después de más investigaciones, resulta que "simplemente requiere el diseño automático" es incorrecto. Fue mi código de muestra que requirió Diseño automático. Hice una pequeña modificación en DynamicHeightCell y ahora funciona con o sin diseño automático.

Respuesta original

Simplemente requiere diseño automático. No es sorprendente, realmente, pero debe estar absolutamente documentado.

Aquí hay un proyecto de trabajo que muestra tableView:estimatedHeightForRowAtIndexPath: funciona correctamente con diseño automático. Si desactivas el Diseño automático en el guión gráfico, se comporta como lo has descrito.

Demostración de altura de fila estimada


- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { }

Este método de delegado se usa generalmente cuando tiene numerosos números de celdas dinámicas, lo que proporciona la estimación aproximada de la celda.

Por ejemplo: si tiene 100 celdas con cada altura desde 200 hasta 300 (por ejemplo, 201, 207, 250, 299, 300 ...) puede estimar la altura de la celda de aproximadamente 250. Es decir

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return 250; }

  • Proporcionar una estimación de la altura de las filas puede mejorar la experiencia del usuario al cargar la vista de tabla.
  • Si este delegado no se implementa, puede ser costoso calcular todas sus alturas y, por lo tanto, conducir a un tiempo de carga más largo.