2009-09-21 9 views
5

Quiero cambiar el tamaño de mis celdas de vista de tabla desde el interior de la celda en lugar de desde UITableViewDelegate. Los cambio de tamaño según el contenido asincrónico, por lo que no puedo clasificarlos en el delegado.¿Es posible cambiar el tamaño de una UITableViewCell sin usar UITableViewDelegate?

Intenté configurar self.frame dentro de la celda, pero la vista de tabla era realmente infeliz sobre eso. Las células se superponían y todo tipo de locura estaba ocurriendo.

Respuesta

5

Usted simplemente tiene que utilizar la vista de tabla para controlar la altura. Puede decirle a la tabla que una celda se ha alterado utilizando las llamadas para eliminar y luego volver a agregar celdas específicas, para que no tenga que volver a cargar toda la tabla, pero la altura debe buscarse mediante la tabla de devolución de delegadosView: heightForRow: atIndexPath:

No veo por qué esto no es práctico. Puede ejecutar cualquier cantidad de sistemas de sincronización que actualicen un caché de altura central en manos del delegado de la vista de tabla: cada vez que cree una celda puede asignarla al delegado como referencia para que pueda comunicarse de nuevo con la mesa y sabe que las celdas necesitan recarga y cuáles son las nuevas alturas.

Si lo piensas bien, la mala vista de tabla es una vista de desplazamiento que tiene que administrar todas estas celdas separadas y mantenerlas juntas visualmente, por lo que es desagradable una celda irse y comenzar a alterar marcos sin dejar pasar la tabla ver saber lo que está pasando de todos modos. Lo mejor es dejar que la mesa conduzca y decirle qué hacer.

+0

Sí, si llama a [tableView reloadData] llamará al método de delegado 'tableView: heightForRow: atIndexPath:' donde tendrá la oportunidad de calcular las alturas de celdas adecuadas en función de sus datos. Sin embargo, tenga en cuenta que esto puede ser costoso en términos de rendimiento de desplazamiento si tiene celdas muy altas o muchas de ellas. – runmad

+0

Por eso la parte de caché de altura es realmente importante, por lo que no tiene que trabajar mucho para decirle al sistema qué alturas tiene. –

+1

No necesita llamar a [tableView reloadData], como sugiere Canada Dev. Más bien, puede llamar a [tableView beginUpdates]; [tableView endUpdates]; lo que provocará que tableView vuelva a medir cada celda (call heightForForForRow: atIndexPath: para cada celda) sin volver a cargar cada celda. – TomSwift

0

Usted debe tratar de manejar las células marco propertys contentView, en lugar de las células propio marco heres una referencia http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/contentView

+0

Estoy agregando vistas en contentView. Estoy cambiando el tamaño de 'self.frame' en lugar de' self.contentView.frame' porque el contentView cambia de tamaño automáticamente con la autoResizingMask. De cualquier forma, establecer el marco de 'self.view' o' self.contentView' no soluciona el problema. TableView todavía está muy confuso si lo dimensiona desde dentro de la celda. –

1

No, no puede establecer el tamaño de la celda sin usar el UITableViewDelegate. Cambiar el tamaño de la celda realmente cambia el tamaño de la celda, pero no cambiará las compensaciones con las que el UITableView dibuja las celdas. Lo que dará lugar a superposiciones y lagunas en todo el lugar.

Tu amigo es tableView:heightForRowAtIndexPath:, y debería ser rápido. Si lo reemplaza, la vista de tabla ya no puede suponer que todas las filas son de la misma altura. Y así debe consultar todas las filas por su altura cada vez que extrae celdas.

Cuestiones relacionadas