¿Separadores UITableView dibujados incorrectamente a través de la reutilización de celdas?

Estoy trabajando en un proyecto iOS 5 con storyboards y, por lo tanto, utilizando prototypes de celdas de tablas dinámicas en IB. En una de las vistas, tengo una vista de tabla con celdas de altura variable, con la altura de la celda calculada a partir de la altura del contenido.

tableView:heightForRowAtIndexPath: devuelve los valores correctos para todas las celdas cuando se visualiza por primera vez la vista de tabla. Todo está bien cuando se desplaza hacia abajo por unos pocos elementos, pero algo va mal: las celdas reales parecen ser la altura correcta, incluidas sus áreas táctiles, pero sus separadores se representan en los lugares incorrectos (dentro de las celdas en lugar de entre ellos).

Desde la medición de la location del separador, parece como si la reutilización de la célula pudiera tener algo que ver con esto. Los separadores para las tres primeras celdas se representan correctamente, pero no el cuarto. heightForRowAtIndexPath: devuelve la altura correcta para este (125 píxeles en este caso), y sus subvistas contenidas están en su lugar correcto. Sin embargo, el separador se representa a solo 108 píxeles del separador anterior, colocándolo dentro del área alta de 125 píxeles de la celda.

Aquí está el pateador: 108px es la altura de la celda de la primera table, ahora fuera de la vista y probablemente reutilizada. No tengo una testing definitiva de esto, pero parece que la vista de tabla ignora heightForRowAtIndexPath: para estas celdas y solo representa el separador de acuerdo con la altura de la celda reutilizada.

Esto no explica por qué un grupo de celdas posteriores más cortas no se convierten en separadores. Pero esto es todo lo que tengo que seguir.

¿Hay alguna solución alternativa, una configuration de IB o alguna otra cosa que pueda ayudar?

Tuve el mismo problema donde los separadores se mostraban en posiciones aparentemente aleatorias.

Resultó que el problema era que estaba sobrescribiendo layoutSubviews pero olvidé llamar a [super layoutSubviews] . Agregar esa llamada solucionó el problema por mí.

También conocí este extraño problema. Para una celda de tabla personalizada, agregue una capa como separador puede ser una mejor opción.

en el método initWith *** de la class de celda de tabla personalizada:

 separator = [CALayer layer]; separator.backgroundColor = [UIColor colorWithWhite:0.8f alpha:1.0f].CGColor; [self.layer addSublayer:separator]; 

actualizar el marco del separador en el método layoutSubviews:

 - (void)layoutSubviews { CGFloat height = 1.0f; separator.frame = CGRectMake(0.0f, self.frame.size.height - height, self.frame.size.width, height); [super layoutSubviews]; }