UITableView con alturas de celda dinámicas: ¿qué debo hacer para corregir el desplazamiento hacia abajo?
Estoy construyendo un diminuto cliente de Twitter en el iPhone. Naturalmente, estoy mostrando los tweets en un UITableView y, por supuesto, tienen diferentes longitudes. Estoy cambiando dinámicamente la altura de la celda según el texto bastante bien:
- (CGFloat)heightForTweetCellWithString:(NSString *)text {
CGFloat height = Buffer + [text sizeWithFont:Font constrainedToSize:Size lineBreakMode:LineBreakMode].height;
return MAX(height, MinHeight);
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *text = // get tweet text for this indexpath
return [self heightForTweetCellWithString:text];
}
}
Estoy mostrando la celda de tweet real usando el algoritmo del libro PragProg:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"TweetCell";
TweetCell *cell = (TweetCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [self createNewTweetCellFromNib];
}
cell.tweet.text = // tweet text
// set other labels, etc
return cell;
}
Cuando inicio, todos los tweets visibles se muestran bien. Sin embargo, cuando me desplazo hacia abajo, los tweets a continuación están bastante desordenados: parece que una vez que una celda se desplaza fuera de la pantalla, la altura de la celda de arriba cambia de tamaño para ser más grande de lo que debería ser y oscurece parte de la celda debajo de ella. Cuando la celda llega a la parte superior de la vista, se reinicia y se representa correctamente. Desplazarse hacia arriba no presenta dificultades.
Aquí hay un video que muestra esto en acción: http://screencast.com/t/rqwD9tpdltd
Ya lo he intentado bastante: cambiar el tamaño del marco de la celda al crearla, usar diferentes identificadores para celdas con diferentes alturas (es decir [NSString stringWithFormat:@"Identifier%d", rowHeight]
), cambiar propiedades en Interface Builder...
Si hay fragmentos de código adicionales que pueda publicar, hágamelo saber. ¡Gracias de antemano por tu ayuda!
Suspiro. Resulta que no modifiqué todas las propiedades lo suficientemente bien. Pero al menos me he librado de ese error. :)
Este comportamiento se solucionó asegurándose de marcar la propiedad "Subvistas de clips" del archivo UITableViewCell
.
El comportamiento se debió a que declaré que la etiqueta de texto de mi tweet tenía la altura máxima necesaria: cuando las subvistas de la celda de la tabla no estaban recortadas, la etiqueta en la celda de arriba se mostraría por encima de la celda de abajo. Esto no fue visible en la primera representación de la pantalla debido al orden en que el SDK representa las celdas (hacia abajo) y cómo apila cada una sobre la otra.