Mi aplicación necesita tener celdas de tabla de altura variable (ya que en cada celda de tabla difiere en altura, no es necesario que cada celda pueda redimensionarse).¿Cómo puedo hacer celdas de tabla de altura variable en el iPhone correctamente?
Tengo una solución que actualmente funciona, pero es kludgy y lenta.
Mi solución actual:
para poder efectuar las celdas de la tabla, calculo que tan alto cada célula tiene que ser mediante llamadas a métodos de dimensionamiento como -sizeWithFont:constrainedToSize:
en sus datos. Luego sumar las alturas, permitir algo de relleno y almacenar el resultado con los datos.
Luego, cuando mi UITableViewDelegate recibe el -tableview:heightForRowAtIndexPath:
, averiguo qué elemento se representará para esa celda y devolveré la altura que calculé anteriormente.
Como dije, esto funciona, pero llamar a -sizeWithFont:constrainedToSize:
es muy lento cuando lo haces para cientos de elementos secuencialmente, y creo que se puede hacer mejor.
Para que esto funcione, tenía que mantener dos partes de código, una que calcule las alturas de las celdas, y una que realmente dibuje las celdas cuando llegue el momento.
Si algo sobre el elemento de modelo cambió, tuve que actualizar estos dos trozos de código, y de vez en cuando todavía no coinciden perfectamente, a veces resultando en celdas de tabla que son un poco demasiado pequeñas para un determinado artículo, o demasiado grande.
Mi Solución propuesta:
por lo que quiero acabar con el calcular previamente la altura de la celda. A) porque rompe el paradigma MVC y B) porque es lento.
Así que mi celda se dibuja a sí misma, y como resultado, termina con la altura de celda correcta. Mi problema es que no tengo forma de decirle a la mesa que vea la altura de la celda antes de que se dibuje, y para entonces ya es demasiado tarde.
Intenté llamar a -cellForRowAtIndexPath:
desde -tableView:heightForRowAtIndexPath:
pero esto se atasca en un bucle infinito, ya que el primero llama al segundo en algún punto, y viceversa (al menos esto es lo que vi cuando lo probé).
Así que esa opción está fuera de cuestión.
Si no especifico un tamaño en la altura para el método de delegado de fila, entonces la vista de tabla se vuelve gruesa. Las celdas tienen la altura perfecta, pero su posición x es la de las celdas de alturas fijas.
Messed Table Cells http://jamsoftonline.com/images/messed_table_cells.png
Aviso cómo la célula inferior es el tamaño correcto - es sólo la superposición de la celda anterior, y la celda anterior se superpone su anterior, y así sucesivamente y así sucesivamente.
También con este método, mientras se desplaza hay algunos artefactos que creo que pueden estar relacionados con el identificador de reutilización de las celdas.
Así que cualquier ayuda aquí sería gratamente apreciada.
tengo el mismo problema. -cellForRowAtIndexPath: calls -tableView: heightForRowAtIndexPath: si se llama en este último (observe que no llama a este último si no se llama en este último) me vuelve loco. – an0