2010-06-18 11 views
55

Tengo el UITableView agrupado clásico con UITextViews editable dentro de cada célula. Estas vistas de texto pueden tener una sola línea o múltiples líneas, y quiero que la celda aumente su altura a medida que el usuario escribe y el texto comienza una nueva línea.Cómo redimensionar dinámicamente altura UITableViewCell

Mi pregunta es: ¿Debo volver a cargar toda la tabla para aumentar la altura de una celda? ¿No hay otro método?

He estado buscando mucho, y las respuestas y tutoriales anteriores solo hablan sobre cómo calcular la altura del texto, cómo implementar heightForRowAtIndexPath ... cosas que ya sé. Mi preocupación es que, para lograr lo que deseo, tenga que calcular la altura y volver a cargar la tabla cada vez que el usuario ingrese un nuevo personaje, que no me parece muy limpio ni eficiente.

Gracias.

Respuesta

60

No siempre tiene que volver a cargar toda la tabla. En su lugar, solo puedes volver a cargar esa fila.

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade]; 
+0

Gracias! Pero ahora tengo otro problema: solo quiero volver a cargar esa fila para aumentar su tamaño, no quiero que se vuelva a instanciar el contenido de la celda. Sin embargo, dequeueReusableCellWithIdentifier: @ "customid" solo comienza a reutilizarse después de la segunda llamada. ¿Qué podría hacer? – araid

+0

@rickharrison realmente puede, revisa mi respuesta a continuación. –

+0

Está haciendo el trabajo realmente bien, pero el contenido de la celda crece, respectivamente. ¿Cómo puedo evitar esto? – Gal

26

Para ser más específicos, sí, usted tiene que poner en práctica tableView:heightForRowAtIndexPath: para calcular la nueva altura, y luego hacer como dice Rick Harrison y llame [tableView reloadRowsAtIndexPaths:withRowAnimation]. Digamos que sus celdas pueden tener una altura expandida y una altura normal, y usted desea que crezcan cuando se toca. Que puede hacer:

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*) indexPath 
{ 
    if ([expandedPaths containsObject:indexPath]) { 
     return 80; 
    } else { 
     return 44; 
    } 
} 

-(void)tableView:(UITableView*) didSelectRowAtIndexPath:(NSIndexPath*) indexPath 
{ 
    [expandedPaths addObject:indexPath]; 
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 
79
[tableView beginUpdates]; 
[tableView endUpdates]; 
+13

pruébelo, este código fuerza a UITableView a recargar únicamente los tamaños de celda, pero no los contenidos de la celda. –

+0

Si bien esto funciona básicamente, no produce una animación tan fluida si creces la celda como volver a cargar la celda con una transición de fila automática. –

+1

Genial ... Úselo junto con reloadRowsAtIndexPaths si desea una animación en algunas de sus filas. –

5

-reloadRowsAtIndexPaths:withRowAnimation no cambiar la altura UITableViewCell, incluso después de cambiar el marco de la célula. Solo funcionó cuando lo seguí con un -reloadData:

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade]; 
[tableView reloadData]; 
+0

Tal vez estaba haciendo referencia a indexPath incorrecto, si depura la aplicación, verá claramente que después de llamar a tableView reloadRowsAtIndexPath: el método tableView: heightForRowAtIndexPath se llama de hecho. –

Cuestiones relacionadas