Se detectó un caso donde las restricciones sugieren ambiguamente una altura de cero

120

Después de actualizar a Xcode 6.1 beta 2 cuando ejecuto mi aplicación que contiene celdas de vista de tabla, el asistente de depuración dice:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Antes, cuando usaba Xcode 5 en este proyecto, recibía algunos errores, pero esos han desaparecido desde que actualicé. No tengo otros errores o advertencias ahora. Ya he intentado ajustar los tamaños de todas las celdas de vista de tabla y también he intentado usar la altura estándar, pero sigo recibiendo la misma advertencia:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

También he leído todos los temas similares sobre esto, pero ninguna de sus soluciones ayuda. Cuando pruebo la aplicación con el simulador, la aplicación funciona bien, excepto las imágenes que se supone que están en las celdas tableView no están allí.

David E
fuente
2
Recibo el mismo error para la celda de vista de colección. Lo que hago por esto. Alguna sugerencia.
Python
Tal vez debería verificar si ya ha agregado el archivo xib al stackoverflow
onmyway133
Esto me sucedió en iOS 8.1, pero ya no en iOS 8.4. Si especificó la altura, supongo que es solo un error de Xcode.
samwize

Respuestas:

126

Tres cosas han logrado silenciar esta advertencia hasta ahora. Puede recoger el más conveniente para usted. Sin embargo, nada bonito.

  • Para configurar la altura de celda predeterminada en viewDidLoad

    self.tableView.rowHeight = 44;
  • Vaya al guión gráfico y cambie la altura de la fila en su vista de tabla a algo diferente de 44.

  • Para implementar el método de delegado de tableview heightForRowAtIndexPath

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }

Extraño.

Viktor Kucera
fuente
También he intentado usar su método, pero necesito agregar una @property para rowHeight, pero no sé el tipo de objeto correcto para usar
David E
Puede que no haya recibido su nota, pero rowHeight es una propiedad de UITableView. Simplemente conecte su mesa a un tomacorriente y listo.
Viktor Kucera
44
Esto se debe a que si mantiene el valor de 44 puntos en IB, considerará que desea usar celdas de tamaño propio. stackoverflow.com/questions/25888126/… (pero sí, este es un comportamiento extraño de hecho)
Guillaume Algis
Entonces aparentemente tenía dos métodos viewDidLoad y puse self.tableView.rowHeight = 44;el incorrecto. El error se fue! gracias
David E
Gracias Guillaume Algis por aclarar esto. Sin embargo, todavía es muy espeluznante.
Viktor Kucera
216

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:

  1. 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.

  2. 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.

Woodster
fuente
3
Esta es una gran explicación de la razón raíz de esta advertencia. ¡Muchas gracias por tu tiempo, Woodster!
Golden Thumb
44
Al igual que lo que dijo Woodster, extrañé la parte inferior de las limitaciones. Cuando se agregó mi problema se resolvió.
Golden Thumb
Después de probar casi 20 cosas, ¡este es el único que funcionó!
Julio Rodrigues
Este hombre lo clavó! Se merece y vota y esta debe ser la respuesta aceptada. +1
caribe
1
Vea esta respuesta stackoverflow.com/a/29565073/4080860 para descubrir qué celda no tiene restricciones.
hhanesand
11

Tuve este problema después de crear una costumbre UITableViewCelly agregar mis subvistas a la celda en lugar de su contentView.

ABakerSmith
fuente
10

Para resolver esto sin un método programático, ajuste la altura de la fila de la vista de tabla en el Inspector de tamaño del guión gráfico.

ingrese la descripción de la imagen aquí

Anconia
fuente
La mejor solución para mí porque está usando el material del guión gráfico en lugar de líneas para el código.
zyc
6

Este es un problema de autolayout. Asegúrese de que sus subvistas tengan todas las restricciones. Para mí, faltaba la restricción inferior para la Etiqueta del título en la celda. Cuando agregué eso, la advertencia desapareció y todo apareció perfectamente.

Alok
fuente
No sé por qué esto fue rechazado, ya que es una respuesta perfectamente buena. Consulte aquí para obtener ayuda sobre cómo determinar qué celda tiene problemas para ser distribuida stackoverflow.com/a/29565073/4080860
hhanes y el
5

Simplemente habilite las celdas de vista de tabla de tamaño automático

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

& asegúrese de agregar restricciones en todos los lados de UITableViewCellun-

ingrese la descripción de la imagen aquí

Jack
fuente
En realidad, la advertencia desapareció cuando desactivé las celdas de vista de tabla auto-dimensionadas.
probado el
@turingtested debe habilitar la celda de vista de tabla de tamaño automático para brindar soporte en varios dispositivos.
Jack
De acuerdo, pero por favor lea la pregunta original. Lo que quise decir es que su solución sugerida no funcionó, al menos no para mí.
probado el
FYI UITableViewAutomaticDimensionha cambiado su nombre aUITableView.automaticDimension
atineoSE
5

Si está utilizando una celda estática o una celda dinámica, simplemente agregue un poco de altura de fila a la vista de tabla en la tabla del inspector y desmarque el automático al lado derecho de la altura de fila, eso es todo, dejará de recibir esta advertencia.ingrese la descripción de la imagen aquí

Amit Verma
fuente
Descubrí que lo contrario es más efectivo: establezca una altura estimada explícita y deje que la altura de la fila sea automática.
NRitH
4

Recibí esta advertencia hoy. Esto es lo que lo hizo desaparecer para mí (en el generador de interfaces)

1. Establezca el campo de altura de fila para la vista de tabla en algo diferente de 44 2 Establezca el campo de altura de fila para la celda tableView en algo diferente de 44

No tuve que hacer ningún cambio en el código

humilde peregrino
fuente
3

En mi caso, estaba construyendo la celda mediante programación y seguía recibiendo este error.

Estaba agregando las subvistas y restricciones en el método de UITableViewCell's initasí:

addSubview(rankingLabel)
addConstraints(cellConstraints)

Resolví el problema agregándolos a la celda en su contentViewlugar:

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)
Gohnjanotis
fuente
1
Siempre agregue subvistas al contentView, no al UITableViewCelldirectamente.
dinesharjani
3

Establezca el alto de fila estimado en cero y la advertencia desaparece:

ingrese la descripción de la imagen aquí

TruMan1
fuente
El verdadero problema es una restricción que falta en alguna parte. Probablemente esté ingresando algo verticalmente en lugar de establecer restricciones superiores / inferiores
TruMan1
1

Yo también experimenté esta advertencia al pasar a Xcode 6 GM. Solo recibí la advertencia cuando volví a girar el dispositivo a su posición original.

Estoy usando UITableViewCells personalizados. La vista de la tabla del guión gráfico se establece en mi tamaño personalizado (100.0 en mi caso). Si bien las celdas de la tabla se procesan correctamente como lo hicieron en versiones anteriores, no me gustó el mensaje de advertencia.

Además de las ideas anteriores, agregué esto

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100.0;
}

La pantalla se procesa ... responde a la rotación y no más mensajes de advertencia.

DannyJi
fuente
Así que intenté usar tu método usando la línea que me diste, pero aún aparece el mismo error. Tampoco he estado usando la rotación en mi aplicación.
David E
1

En xcode 6.0.1 había eliminado estas advertencias especificando la altura de la fila usando:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}
Fantini
fuente
1

Si ha creado un TableViewCell personalizado para TableView, asegúrese de haber dado las restricciones inferior y superior a sus celdas, también podría recibir este mensaje si sus subvistas dentro de las celdas personalizadas están alineadas en el centro Y, lo que no revelaría ningún mensaje de error, pero causaría problemas con la altura de la fila de identificación para la vista de tabla a su vez, como en la Imagen que he adjuntado, aquí tenemos restricciones superiores e inferiores

Cuando crea una celda personalizada para tableView, debe tener una altura de fila específica o restricciones superiores e inferiores para las subvistas de la celda personalizada dentro de la celda (por ejemplo, etiqueta en la celda personalizada como en la imagen de abajo)

Pero si esto no funciona, puede intentar establecer el alto de fila para su celda en lugar de ser automático como en esta imagen

Pero asegúrese de que si desactiva esa marca automática, debe ajustar el tamaño de la fila para los cambios mediante programación que podrían haberse realizado automáticamente

hoyo monstruo
fuente
0

En el guión gráfico, configure el cell Row heightcampo con el mismo valor que Row heighten tableView(ambos con el mismo valor me funcionaron).

Si agrega una heightForRowAtIndexPathfunción a su código, puede provocar un problema de rendimiento porque se llamará para cada celda, así que tenga cuidado.

Daniel Gomez Rico
fuente
0

También puede ver este mensaje si sus únicas restricciones están configuradas para alinear todos los elementos verticalmente y no tiene / desea una altura especificada para la celda. Si establece una restricción superior / inferior en el elemento, la advertencia desaparecerá.

Micah Montoya
fuente
0

Tuve este problema cuando mis etiquetas y vistas en la tableViewCell personalizada estaban restringidas a la customCell, no a su Vista de contenido. Cuando borré las restricciones y las conecté a las celdas Vista de contenido, el problema se resolvió.

Marija Zivkovic
fuente
0

Recibí el mismo mensaje de error, asegúrese de que todas sus salidas sean válidas, como la vista de tabla y las restricciones de vista de tabla

Gulz
fuente
0

Si está haciendo un cálculo dinámico de altura,

  • Debe tener todos los elementos vinculados entre sí en términos de restricciones como arriba y abajo.
  • definitivamente debería tener una restricción inferior que esté vinculada al elemento en la parte inferior de su celda
S. Mert
fuente
0

También tengo un problema similar para la celda de vista de tabla personalizada que tiene una altura de fila dinámica. La altura dinámica no se reflejó y recibió la misma advertencia en la consola. La solución es agregar subvistas a la celda en lugar de contentView. Por cierto, he creado subvistas programáticamente.

Srinivas G
fuente
0

Tengo este problema en TableViewCells donde las restricciones se establecen en la inicialización, pero donde los contenidos de la celda se cargan después, esto significa que el motor de distribución automática no puede determinar la altura. Las otras soluciones aquí no funcionan porque necesito que la altura de la celda sea UITableView.automaticDimension.

Acabo de agregar una restricción adicional a la celda:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)
León
fuente
0

Recibí esta advertencia hoy. Todo lo que hice fue agregar una línea adicional a mi código.

tableView.rowHeight = 200;

agregue esta línea de código dentro del

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
  ...
}

y el código final parece

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  tableView.rowHeight = 200;
  ...
}

este código aumentará la altura de la celda de la fila de la tabla a 200, la altura predeterminada es 44

SudhakarH
fuente
-1

Tengo el mismo error, debido a esta línea se mostró este error.

self.layer.backgroundColor = UIColor (blanco: 1, alfa: 0.2) como! CGColor

Solo cambio la línea de la siguiente manera para corregir el error

self.layer.backgroundColor = UIColor (blanco: 1, alfa: 0.2) .cgColor

Malik Hassnain
fuente