ios - Llamar `[UIView-systemLayoutSizeFittingSize:]` en un UITableViewCell siempre falla
uitableview dynamic height (2)
Es difícil decir algo concreto basándose en tu publicación porque no publicaste las restricciones que utilizaste. Documentación de Apple:
systemLayoutSizeFittingSize:
Devuelve el tamaño de la vista que satisface las restricciones que mantiene.
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 texto. Puedes poner tu texto en el 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 texto y la fuente (y todas las demás propiedades que pueden causar el cambio de altura del UITextView) de la UITextView antes de usar la propiedad contentSize. También debe agregar primero UITextView a la vista.
////// EDITAR
El problema de su enfoque con el uso de restricciones puede ser que desee medir la celda que NO se agregó a la vista para que el sistema no tenga todas las informaciones que necesita. No sabe cuánto espacio habrá para el espacio, etc. porque no conoce el área circundante de la celda.
Quiero usar el diseño automático para UITableViewCells. Estas celdas de tabla tienen una altura dinámica (dependiendo de la longitud del texto).
Estoy usando [UIView -systemLayoutSizeFittingSize:]
para calcular la altura de celda adecuada (para regresar en [UITableView -heightForRowAtIndexPath:]
) pero sigo obteniendo los siguientes resultados:
Si paso
UILayoutFittingCompressedSize
,UILayoutFittingCompressedSize
un CGSize de (0,0).Si paso
UILayoutFittingExpandedSize
, mi aplicación se bloquea con este error:*** Fallo de afirmación en - [NSISLinearExpression incrementConstant:], /SourceCache/Foundation_Sim/Foundation-1043.1/Layout.subproj/IncrementalSimplex/NSISLinearExpression.m:620
(Supongo que esto significa que algún número es infinito).
Mi implementación es simple. Calculo la altura de cada objeto y luego lo guardo en caché:
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)
Supongo que este es un problema con las restricciones que establezco, pero:
- Si configuro manualmente
cellHeight
a un valor alto, todas las celdas se ven bien, excepto que la altura es incorrecta. - Interface Builder no me advierte sobre restricciones ambiguas
-
[cell hasAmbiguousLayout]
devuelveNO
. - Mi celda tiene, entre otras cosas, una imagen establecida en 48x48, por lo que un tamaño de (0, 0) no debería satisfacer todas las restricciones.
¿Algunas ideas?
Esto es lo que funciona para mí (nota ''contentView'')
CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
EDITAR: Respondí una pregunta similar y proporcioné un ejemplo completo, aquí:
¿Cómo cambiar el tamaño de Superview para que se ajuste a todas las subvistas con Autolayout?