Se encuentra con el efecto secundario de una nueva característica fantástica en las Vistas de tabla de iOS8: Alturas de fila automáticas.
En iOS 7, tenía filas de un tamaño fijo (configurado con tableView.rowHeight
), o escribiría un código para calcular la altura de sus celdas y lo devolvería tableView:heightForRowAtIndexPath
. Escribir código para el cálculo de la altura de una celda podría ser bastante complejo si tuviera numerosas vistas en su celda y tuviera diferentes alturas para considerar en diferentes tamaños de fuente. Agregue Dynamic Type y el proceso fue un dolor en el culo.
En iOS 8, aún puede hacer lo anterior, pero ahora iOS puede determinar la altura de las filas, siempre que haya configurado el contenido de su celda mediante el Diseño automático. Este es un gran beneficio para los desarrolladores, porque a medida que cambia el tamaño dinámico de la fuente, o el usuario modifica el tamaño del texto usando la Configuración de Accesibilidad, su IU puede adaptarse al nuevo tamaño. También significa que si tiene un UILabel que puede tener varias filas de texto, su celda ahora puede crecer para acomodarlas cuando las celdas lo necesiten y encogerse cuando no es necesario, por lo que no hay espacios en blanco innecesarios.
El mensaje de advertencia que está viendo le dice que no hay suficientes restricciones en su celda para que el Diseño automático informe a la vista de tabla de la altura de la celda.
Para usar la altura de celda dinámica, que, junto con las técnicas ya mencionadas por otros carteles, también eliminarán este mensaje, debe asegurarse de que su celda tenga suficientes restricciones para unir los elementos de la IU a la parte superior e inferior de la celda. Si ha utilizado el diseño automático anteriormente, probablemente esté acostumbrado a establecer restricciones superiores + iniciales, pero la altura de fila dinámica también requiere restricciones inferiores.
El pase de diseño funciona así, lo que ocurre inmediatamente antes de que se muestre una celda en la pantalla, de manera justo a tiempo:
Se calculan las dimensiones para contenido con tamaños intrínsecos. Esto incluye UILabels y UIImageViews, donde sus dimensiones se basan en el texto o UIImages que contienen, respectivamente. Ambas vistas considerarán que su ancho es conocido (porque ha establecido restricciones para los bordes finales / iniciales, o ha establecido anchos explícitos, o ha usado restricciones horizontales que eventualmente revelan un ancho de lado a lado). Digamos que una etiqueta tiene un párrafo de texto ("número de líneas" se establece en 0 para que se ajuste automáticamente), solo puede tener 310 puntos de ancho, por lo que se determina que tiene 120 puntos de altura con el tamaño de fuente actual.
La interfaz de usuario se presenta de acuerdo con sus restricciones de posicionamiento. Hay una restricción en la parte inferior de la etiqueta que se conecta con el margen inferior de la celda. Dado que la etiqueta ha crecido hasta 120 puntos de alto, y como está limitada al fondo de la celda por la restricción, debe empujar la celda hacia "abajo" (aumentando la altura de la celda) para satisfacer la restricción que dice "parte inferior de la celda". la etiqueta siempre está a una distancia estándar de la parte inferior de la celda.
El mensaje de error que informó se produce si falta esa restricción inferior, en cuyo caso no hay nada para "empujar" la parte inferior de la celda lejos de la parte superior de la celda, que es la ambigüedad que se informa: sin nada para empujar la parte inferior En la parte superior, la célula se derrumba. Pero el diseño automático también lo detecta y vuelve a utilizar la altura de fila estándar.
Para lo que vale, y sobre todo para tener una respuesta redondeada, si implementa las alturas de fila dinámicas basadas en el diseño automático de iOS 8, debe implementar tableView:estimatedHeightForRowAtIndexPath:
. Ese método de estimación puede usar valores aproximados para sus celdas, y se llamará cuando la vista de tabla se cargue inicialmente. Ayuda a UIKit a dibujar cosas como la barra de desplazamiento, que no se puede dibujar a menos que la vista de tabla sepa cuánto contenido puede desplazarse, pero no necesita tamaños totalmente precisos, ya que es solo una barra de desplazamiento. Esto permite diferir el cálculo de la altura real de la fila hasta el momento en que se necesita la celda, lo cual es menos computacionalmente intenso y permite que su UITableView se presente más rápido.