Tengo un sistema UITableView
operativo con iOS 8 y estoy usando alturas de celda automáticas a partir de restricciones en un guión gráfico.
Una de mis celdas contiene una sola UITextView
y la necesito para contraer y expandir según la entrada del usuario: toque para reducir / expandir el texto.
Estoy haciendo esto agregando una restricción de tiempo de ejecución a la vista de texto y cambiando la constante en la restricción en respuesta a los eventos del usuario:
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
Cuando hago esto, lo envuelvo en tableView
actualizaciones y llamo [tableView setNeedsUpdateConstraints]
:
[tableView beginUpdates];
[_briefCell collapse:!_showFullBriefText];
[tableView setNeedsUpdateConstraints];
// I have also tried
// [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
// with exactly the same results.
[tableView endUpdates];
Cuando hago esto, mi celda se expande (y se anima mientras lo hace) pero recibo una advertencia de restricciones:
2014-07-31 13:29:51.792 OneFlatEarth[5505:730175] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>",
"<NSLayoutConstraint:0x7f94dced2260 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']-(15)-| (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",
"<NSLayoutConstraint:0x7f94dced2350 V:|-(6)-[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'] (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",
"<NSLayoutConstraint:0x7f94dced6480 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f94de5773a0(91)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>
388 es mi altura calculada, las otras restricciones UITextView
son mías de Xcode / IB.
El último me está molestando, supongo que esa UIView-Encapsulated-Layout-Height
es la altura calculada de la celda cuando se renderiza por primera vez (configuro mi UITextView
altura como> = 70.0), sin embargo, no parece correcto que esta restricción derivada anule un Cnstraint de usuario actualizado.
Peor aún, aunque el código de diseño dice que está tratando de romper mi restricción de altura, no lo hace; continúa recalculando la altura de la celda y todo se dibuja como quisiera.
Entonces, ¿qué es NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(supongo que es la altura calculada para el tamaño de celda automático) y cómo debo forzarlo a que vuelva a calcular limpiamente?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
. Creo que establecer inicialmente la máscara de tamaño automático evita que se agregue la última restricción. Encontré esta solución aquí: github.com/wordpress-mobile/WordPress-iOS/commit/…
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
en su definición, lo que me hizo creer que se trataba de un error de IB . Al menos el mío era de todos modos.