iOS8: las restricciones sugieren ambiguamente una altura de cero


100

¿Alguien tiene alguna idea de cómo depurar esto?

Advertencia una sola vez: se detectó un caso en el que las restricciones sugieren ambiguamente una altura de cero para la vista de contenido de una celda de vista de tabla. Estamos considerando el colapso no intencional y usamos una altura estándar en su lugar.

Las filas tienen una altura fija establecida por

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

Y todos constraintsparecen estar felices ...

Respuestas:


129

Forzar una altura de retorno y una altura estimada hizo que la advertencia desapareciera en mi caso.

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

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

Otra solución en la que no necesita las dos anulaciones es simplemente usarlas self.tableView.rowHeight = 44;en su loadViewmétodo o init.


1
Tengo varias filas de tipo en la sección y solo una de ellas tiene altura dinámica. entonces no está funcionando
Raj Aggrawal

Si configuramos la altura predeterminada en xib / storyboard, no tenemos que implementar estos métodos.
Sábado

77

Lo que también se puede hacer es agregar restricciones verticales desde la parte superior e inferior de la vista de contenido. Esto hará feliz al diseño automático (porque ahora sabe cómo calcular él mismo la altura de la celda).


2
Esto funcionó para mí. Revisé todas las celdas del contenedor y me aseguré de que al menos una subvista tenga una restricción de "espacio superior al contenedor" y "espacio inferior al contenedor".
Rog182

7
Esa es la respuesta correcta para iOS 8 cuando se utilizan celdas de vista de tabla de tamaño propio.
tsafrir

1
¿Te refieres a las restricciones de los elementos dentro de la vista de contenido a la parte superior e inferior de la vista de contenido?
Zack Shapiro

Intenté esto pero sigo recibiendo una advertencia de restricción conflictiva.
Shirish Kumar

2
Asegúrese de agregar la restricción superior e inferior a la vista de contenido de la celda, no a la celda en sí. Si agrega una restricción a la celda, el código seguirá funcionando, pero intentará usar una altura de 0.
Frin

26

Si está utilizando restricciones de autoLayout y UITableViewAutomaticDimension, este error no es un problema erróneo que deba descartarse al anular su altura en el código. Significa que determinar la altura de la celda automáticamente no funciona porque no tiene las restricciones verticales adecuadas necesarias.

Si es como yo y recibía este error y necesitaba ayuda para identificar qué celda arrojaba el error, puede agregar la siguiente línea justo antes de la devolución de su método 'heightforRowAtIndexPath'.

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

Esto imprimirá una larga lista de secciones y filas, pero el error aparecerá inmediatamente después de la celda particular que está causando el error, y puede identificar rápidamente qué celda está causando el problema y corregir sus restricciones en consecuencia. Esto es particularmente útil para celdas estáticas. Anular la altura con un número ingresado manualmente funcionará si no está usando autoLayout y alturas de celda automáticas, pero esencialmente deshabilitará estas características, que es una solución muy pobre si es algo que está tratando de utilizar.

Si no estaba usando anteriormente el método 'heightForRowAtIndexPath' pero desea depurar este error sin deshacer su configuración de UITableViewAutomaticDimension, simplemente agregue esto a su código:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}

Muchas gracias. Esto me ayudó mucho. Al principio pensé que ese problema era con otra celda de vista de tabla. Después de depurarlo, resultó que ese problema estaba en otro.
akozin

Me gustaría hacer esto, pero la sección larga y la fila no están identificadas. ¿Podría aclarar cuáles deberían ser estos en Swift?
DrWhat

9

Parece haber un error en XCode 6.1 que causa este problema si usa el diseño automático y no especifica un valor para la Altura de fila para cada celda de vista de tabla, sino que deja el valor "predeterminado". Con solo marcar la casilla de verificación "Personalizado" junto a la Altura de la fila, para cada celda, la advertencia desaparece.


2
Si está utilizando celdas de tamaño propio, debe dejar la altura de la fila configurada como "predeterminada".
phatmann

1
Esto resolvió la advertencia. Pero creo que solo aparece cuando se usan celdas estáticas en TableView
MontiRabbit

1
@phatmann Este problema solo aparece para celdas estáticas, por lo tanto, las celdas no deben ser de tamaño propio.
ltm

@ltm, ¿las celdas de tamaño propio podrían no ser útiles, en celdas estáticas, si el usuario ha ampliado el texto tal vez? (Ya sabes, en accesibilidad en la configuración del iPhone)
Byron Coetsee

Creo que no es un error, podría ser un problema con las restricciones verticales, tienen que describir completamente la altura de la celda, al menos para las vistas de tabla con dimensión automática.
juanjo

3

Sí, obtiene todas las restricciones "felices" incluso en el caso de que solo tenga restricciones horizontales para los elementos en la celda de la vista de tabla. Tuve el mismo problema. Necesita agregar también restricciones verticales. Al hacerlo, esa advertencia desaparecerá.


3

Las restricciones pueden ser satisfactorias para el diseño, pero no para el propósito de la altura de fila automática. Un diseño feliz significaría que el contenido se puede diseñar sin ambigüedad. Eso satisfaría las comprobaciones en Interface Builder.

Un diseño feliz para la altura de fila automática significaría que, además de lo anterior, también está incluyendo restricciones en la parte inferior de la celda.

Más aquí: Detectado un caso en el que las restricciones sugieren ambiguamente una altura de cero


3

Utilicé Row Height 43 (o <> 44) en el inspector de tamaño de Vista de tabla y el error desapareció. Usando 44 obtengo el error. Xcode versión 6.0.1.

- Esta respuesta fue eliminada por un moderador, no lo hagas, soluciona el problema. Esto RESUELVE el problema para mí y puede que lo haga por otros también. Entonces, ¿podría ser tan amable de no borrarlo nuevamente?


2

No pude eliminar la advertencia, pero para que las restricciones funcionen, configuré la propiedad tableview, nueva en iOS8, estimatedRowHeighten la altura fija y eliminé la heightForRowAtIndexPathimplementación.


Si no eliminó la advertencia, entonces es el sistema el que compensa la restricción faltante y establece la altura de fila == en la propiedad cell.rowHeight. La advertencia es sobre una propiedad de reparación automática, si se cura automáticamente, eso significa que el problema ¿no?
Pedro Borges

2

Si recibe esa advertencia, lo más probable es que esté usando el diseño automático y sus celdas no tengan restricciones dentro de ellas.

Debe dejar de usar el diseño automático o implementar restricciones que definan de manera inequívoca la altura de las celdas.

Puede desactivar el diseño automático en el generador de interfaces desmarcando la opción "Usar diseño automático" en el inspector de archivos a la derecha.

Si elige usar el diseño automático y la altura de sus celdas es fija, implementar las restricciones apropiadas debería ser fácil. Simplemente agregue restricciones de altura para las subvistas de la vista de contenido de la celda e implemente restricciones de espacio vertical entre las subvistas y entre las subvistas y la vista de contenido. Por ejemplo, si su celda tiene una etiqueta, esto funcionaría:

Restricciones verticales

  1. Restricción de espacio vertical entre la parte superior de la vista de contenido y la parte superior de la etiqueta
  2. Restricción de altura fija de la etiqueta
  3. Restricción de espacio vertical entre la parte inferior de la etiqueta y la parte inferior de la vista de contenido

Restricciones horizontales

  1. Restricción de espacio horizontal entre el borde anterior de la vista de contenido y el borde anterior de la etiqueta
  2. Restricción de ancho fijo de la etiqueta
  3. Restricción de espacio horizontal entre el borde posterior de la etiqueta y el borde posterior de la vista de contenido

Estoy usando restricciones, y todos parecen estar felices, como se menciona en la pregunta.
Chris

¿Son esas limitaciones para las subvistas de la vista de contenido de la celda? ¿Qué es lo que parecen? ¿Es posible que tenga algunas células que sean diferentes? Si está definiendo las celdas para que tengan una altura fija utilizando las soluciones de Frederic Bonner, las restricciones se anulan.
wrightak


1

En Swift, forzar una altura de retorno solucionó mi problema:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(indexPath.row == 0){
       return CGFloat(131.0)
    }else if(indexPath.row == 8){
       return CGFloat(97.0)
    }else{
       return CGFloat(44.0)
    }
}

1

Para una solución estándar de pantano, sin restricciones, sin estimar las alturas o sobre la ingeniería del problema. Creé un proyecto predeterminado, conecté la vista de tabla pero olvidé poner el delegado de altura en el controlador de vista . Para hacer que esta advertencia desaparezca, lo necesita.

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

En el controlador de vista de su tabla.


1

Estaba usando un mapView dentro de uitableviewcell. Cambié la altura de la vista del mapa a 1/3 del tamaño de la pantalla del dispositivo. Tengo el mismo error. Solucioné el error agregando restricciones faltantes a la vista de contenido de uitableviewcell.

1) Elimine las restricciones de contentView.

2) Configure Reset to Suggested constants en contentView.

ingrese la descripción de la imagen aquí

3) Agregue las restricciones que faltan, si las hay

4) Nos aseguramos de que la vista de contenido tenga todas las restricciones necesarias. ingrese la descripción de la imagen aquí


0

En mi caso, es porque estoy diseñando la celda con xib y me olvido de agregar ese archivo xib al destino.

Después de agregar ese archivo xib al destino, el problema desaparece


0

Si bien las respuestas en esta página que discuten agregar restricciones de altura o devolver manualmente rowHeights como 44 en heightForRowAtIndexPath hacen que la advertencia desaparezca, son superfluas porque este es un error en Xcode visible en al menos la Versión 6.3.2 (6D2105).

Si establece un punto de interrupción en viewDidLoad, verá que self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) incluso si especifica una altura de fila de 44 en el guión gráfico. Esto se debe a que Apple asume incorrectamente que desea alturas de fila dinámicas si deja la altura de fila en 44, porque no le proporcionaron una bandera para que especifique su preferencia.

A continuación, se muestran algunas posibles soluciones y sus resultados:

  • Establezca la altura de la fila en 43 o 45 en el guión gráfico (funciona).

  • Devuelve manualmente una altura de 44 en heightForRowAtIndexPath (funciona).

  • Agregue restricciones de altura entre los elementos de UITableViewCell y su contentView (funciona).

Desafortunadamente, estas soluciones requieren que cambie su diseño, agregue restricciones innecesarias o agregue código innecesario para solucionar un error. Probé (lo que pensé que era) la solución más simple:

  • Establezca la altura de cada UITableViewCell en 44 (personalizado) en el guión gráfico (falla).

Realmente quería una solución de guión gráfico puro para esto, así que finalmente probé:

  • Agregue un atributo de tiempo de ejecución definido por el usuario a UITableView en el guión gráfico y asigne un nombre a UITableView con una nota sobre cómo se configura su rowHeight para que los futuros desarrolladores puedan encontrarlo: (funciona):

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Estos errores son demasiado comunes en el desarrollo de iOS y obligan a los desarrolladores a dedicar un tiempo excesivo a sopesar las ramificaciones de cómo sus soluciones afectarán la mantenibilidad a largo plazo.

Dado que encontrar una solución conceptualmente correcta que se pueda mantener y que no parezca ofuscada es tan difícil de alcanzar, y suponiendo que Apple solucionará el error y que 44 será la altura de fila predeterminada en el futuro previsible, entonces la restricción o la definida por el usuario Las soluciones de atributos de tiempo de ejecución son probablemente las más fáciles de mantener.


0

Hay dos cosas importantes que están sucediendo aquí, creo.

1) Es muy fácil hacer que las restricciones sean incorrectas si presionas ctrl + arrastrando. Entonces, verifique que lo haya hecho correctamente. Es mejor usar la bandeja en el lado izquierdo de la pantalla para dibujar estas restricciones.

2) En lugar de especificar el estimadoRowHeight en ViewDidLoad o en otro lugar, use el método delegado

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

Esto solucionó el problema de inmediato.


¿Por qué utiliza la anulación?
FractalDoctor

0

También he visto este error al usar guiones gráficos universales o xibs. Si no especifica las restricciones adecuadas para la clase Any x Any size, he visto aparecer este error.

Apple parece haber solucionado esto para iOS9. El error solo sucedió en 8.4 para mí.


0

Estuve dando vueltas y vueltas durante días entre este error y otro error en el que se estaban creando restricciones (no tengo idea de dónde) que entraban en conflicto con las restricciones que quería. Incluso lo hice funcionar en una instancia donde cada propiedad visible era idéntica a la otra. La única solución que encontré fue convertirme en atómico: crear un archivo completamente nuevo con xib y comenzar de nuevo a reconectar los puntos de venta copiando y pegando el código anterior. Puede que no sea la mejor solución, pero a veces, si el problema no es visible, hay poco más que hacer. Al menos, la tecnología atómica es una buena forma de revisar lo que está sucediendo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.