La altura del cuadro UITableViewCell no coincide con la tablaView: heightForRowAtIndexPath:

Estoy construyendo un UITableView con celdas de tabla personalizadas de altura variable, su altura está determinada por el tamaño de un UILabel multilínea contenido. Tengo eltableView:heightForRowAtIndexPath: método de delegado conectado y calculando la altura final correctamente usandosizeWithFont:constrainedToSize:.

Me he encontrado con un problema extraño: en el momento en que el método de origen de datostableView:cellForRowAtIndexPath: se llama, la altura correcta por fila ya se ha determinado como se describe anteriormente, pero el marco de la celda no coincide con esa altura. En cambio, elframe.size.height La propiedad de la celda es la altura de celda predeterminada de la vista de tabla (86 px, como la he establecido en Interface Builder, la altura correcta cuando la UILabel contenida tiene solo una línea de texto), en lugar de ser la altura quetableView:heightForRowAtIndexPath: determinado correcto para esa ruta de índice.

Estoy produciendo las células encellForRowAtIndexPath: usando la salida en cola, es decir,

// Using storyboards, this never returns nil, no need to check for it
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"SomeIdentifier"];
NSLog(@"%f", cell.frame.size.height); // 86, not correct if the cell contains a multi-line UILabel

Parece, entonces, que sea lo que sea que esté haciendo iOS detrás de escena, la eliminación de la cola no está configurando la propiedad de marco de la celda para que coincida con la altura calculada. Esto en sí mismo no es tan sorprendente, ya que la eliminación de la cola se refiere a las instancias de células, no a su geometría. Sin embargo, las celdas se representan correctamente, por lo que la propiedad de altura se establecealgun lado, pero pasa despuescellForRowAtIndexPath:.

Por lo tanto: cuando inicialmente relleno la vista de tabla,cell.frame.size.height es 86 para todas las celdas como aparecen por primera vez cuando desplazo la lista hacia abajo. Dado que la geometría correcta se establece en algún momento después de la primeracellForRowAtIndexPath: para cada fila antes de que se muestre, cuando me desplazo hacia atrás, la propiedad de altura es correcta para cada celda que vuelve a verse después de ser reutilizada.

Después de esto, puedo desplazar la vista de tabla hacia adelante y hacia atrás a voluntad, y la propiedad de altura permanece correcta para cada celda desde ese punto en adelante.

¿Cuál es la forma correcta de obtener la altura correcta de la celda la primera vez, antes de que ocurra cualquier reuso basado en la salida de la cola? Necesito hacer esto para reubicar un poco las subvistas de la celda de la tabla. ¿Necesito llamar manualmenteheightForRowAtIndexPath: encellForRowAtIndexPath: y luego configurar manualmente el marco de la instancia de CustomCell recién creada para que coincida con esa altura? Esto parece redundante, y necesitaría crear un mecanismo para detectar cuándo se crea la celda por primera vez con la altura de trama incorrecta en comparación con cuando se elimina la cola con la altura de trama correcta más adelante para evitar esta redundancia.

Entonces, si alguien puede arrojar algo de luz sobre la lógica que está detrás de esto, lo apreciaría.

Respuestas a la pregunta(3)

Su respuesta a la pregunta