¿estimatedHeightForRowAtIndexPath puede, de hecho, cambiar la altura final "correcta" de una fila?

Acabo de descubrir un problema asombroso o un comportamiento contra intuitivo al usar estimatedHeightForRowAtIndexPath

(1) Mi table tiene alturas de hileras muy variadas. Los resultados finales pueden variar de 111 a aproximadamente 400.

(2) Calculo absolutamente perfectamente cada altura de fila. Tengo estos disponibles en una matriz, es decir, en caching.

{Tenga en count que esto es exactamente lo que, al parecer, los ingenieros de Apple ahora recomiendan … ejemplo, punto 5 … Uso de layout automático en UITableView para layouts de celdas dinámicas y alturas de filas variables }

(3) Cuando heightForRowAtIndexPath solicita una altura, le doy absolutamente 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 que finalmente dimensiona la altura de una celda, no "yo".}

ESTO TODO FUNCIONA PERFECTAMENTE.

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

Ahora, agrego el código …

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

DE HECHO, LA MESA NO FUNCIONA ……………… ¡LAS ALTURAS DE FILA SE CONVIERTEN EN ALEATORIO!

¿ALGUIEN HA VISTO ESTE INCREÍBLE COMPORTAMIENTO?

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

Creo que PODRÍA estar haciendo algo como esto: diga que el valor estimatedHeightForRowAtIndexPath es 150. A veces usa 150 para filas que (de hecho () demuestran ser de ese tamaño o less, pero a veces se aplica al tamaño real de heightForRowAtIndexPath.

Por otro lado, si pones un valor para estimatedHeightForRowAtIndexPath que sea más pequeño de lo que realmente existirá (digamos 100 en mi ejemplo) que "no funciona por completo", simplemente obtienes lo que solo parece ser alturas aleatorias en las celdas.

las células muy altas parecen funcionar correctamente, tal vez algo así como "si la altura de heightForRowAtIndexPath es el doble del estimado, entonces sí usa la altura real"

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

Para ser claro, no estoy usando autolayout, es el tipo de célula que solo tienes que build. (Me temo que no tengo idea de cómo funciona esto con autolayout.) Solo es Xcode5 / iOS7 +.

Respuesta Actualizada

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

Respuesta original

Simplemente requiere layout automático. No es sorprendente, de verdad, pero absolutamente debe documentarse.

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

Demostración estimada de altura de fila

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

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

Para ejemplo: si tiene 100 celdas con una altura de 200 a 300 (por ejemplo, 201, 207, 250, 299, 300 …), puede estimar la altura de la celda de alnetworkingedor de 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, podría ser costoso calcular todas sus alturas y, por lo tanto, conducir a un time de carga más largo.