Llamar “ en una UITableViewCell siempre falla

Quiero usar el layout automático para UITableViewCells. Estas celdas de tabla tienen una altura dinámica (dependiendo de la longitud del text).

Estoy usando [UIView -systemLayoutSizeFittingSize:] para calcular la altura de celda apropiada (para volver en [UITableView -heightForRowAtIndexPath:] ) pero sigo obteniendo los siguientes resultados:

  • Si paso UILayoutFittingCompressedSize , obtengo un CGSize de (0,0).

  • Si paso UILayoutFittingExpandedSize , mi aplicación se bloquea con este error:

    *** Error de aserción en – [NSISLinearExpression increment Constant:], /SourceCache/Foundation_Sim/Foundation-1043.1/Layout.subproj/IncrementalSimplex/NSISLinearExpression.m:620

(Mi conjetura es que esto significa que algún número es infinito).

Mi implementación es simple. Calculo la altura para cada object y luego lo cacheo:

 MessageCell *cell = // allocate a new cell... // set up the cell (assign text, images, etc) CGSize size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; self.cellHeight = size.height; // size always equals (0, 0) 

Presumo que este es un problema con las restricciones que establecí, pero:

  • Si estableciera manualmente cellHeight en un valor grande, todas las celdas se cellHeight bien, excepto que la altura es incorrecta.
  • Interface Builder no me da advertencias sobre restricciones ambiguas
  • [cell hasAmbiguousLayout] devuelve NO .
  • Mi celda tiene, entre otras cosas, una image establecida en 48×48, por lo que un tamaño de (0, 0) no debe satisfacer todas las restricciones.

¿Algunas ideas?

Esto es lo que me funciona (nota 'contentView')

 CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

EDITAR: Respondí a una pregunta similar y proporcioné un ejemplo completo, aquí:

¿Cómo cambiar el tamaño de Superview para que se ajuste a todas las subvenciones con autolayout?

Es difícil decir algo concreto basándose en tu publicación porque no publicaste restricciones que usas. Documentación de Apple:

systemLayoutSizeFittingSize:

Devuelve el tamaño de la vista que satisface las restricciones que posee.

Tal vez creó restricciones que pueden interpretarse de la misma manera que el tamaño de la celda es igual a (0,0).

Hay otra forma de verificar la altura de la celda con el text. Puede poner su text en UITextView y luego:

 UITextView textView; textView.text = @"l"; textView.font = [UIFont fontWithName:FONT_NAME size:FONT_SIZE]; //some code here // CGFloat cellHeight = textView.contentSize.height; 

Es importante establecer el text y la fuente (y cualquier otra propiedad que pueda causar el cambio de la altura de UITextView) de UITextView antes de usar la propiedad contentSize. Además, primero debe agregar UITextView a la vista.

////// EDITAR

El problema con su enfoque con el uso de restricciones puede ser que desea medir la celda que NO se agrega a la vista para que el sistema no tenga todas las informaciones que necesita. No sabe cuánto espacio será para el espacio, etc. porque no conoce el área circundante de la celda