ios - uicollectionviewdelegateflowlayout - UIView-Encapsulated-Layout-Height y Vista de contenedor
uicollectionview resize cell (7)
Tengo UIViewController 1
, que tiene scroll view
. Dentro de esta vista de scrollview
hay una container view
que está fijada a la top/bottom leading/trailing
(sin altura fija). Container view
tiene UITableView
a la top/bottom trailing/leading
y height constraint with 0 constant
, que cambiará en updateViewConstraints
a la altura de tamaño de contenido.
Cuando aparece Vista de UIViewController 1, la Vista de contenedor tiene una restricción:
NSLayoutConstraint: 0x7b03e5f0 V: [UITableView: 0x7c42a200 (54)], NSLayoutConstraint: 0x7b0ba120 V: | - (0) - [UITableView: 0x7c42a200] (Nombres: ''|'': UIView: 0x7b0b7000), NSLayoutConstraint: 0x7b0ba1b0 V: [UITableView: 0x7c42a200] - (0) - | (Nombres: ''|'': UIView: 0x7b0b7000), NSLayoutConstraint: 0x7b65f900 ''UIView-Encapsulated-Layout-Height'' V: [UIView: 0x7b0b7000 (0)]
Intentará recuperarse rompiendo la restricción
NSLayoutConstraint: 0x7b03e5f0 V: [UITableView: 0x7c42a200 (54)]
¿Qué es UIView-Encapsulated-Layout-Heigh
t? ¿Cómo puedo omitirlo? Porque rompe la restricción "correcta" (que actualizo a la altura del tamaño del contenido) .Gracias
Establezca la restricción de altura de la vista del contenedor. Cree un IBOutlet de dicha restricción de altura, llámelo "containerViewHeightConstraint" o algo así. Cuando actualice la restricción de altura de la vista de tabla a 54, diga algo como:
self.containerViewHeightConstraint.constant = 54.0;
Finalmente encontré un problema. La vista que se agrega como subvista a vista de contenedor tiene traduccionesAutoresizingMaskIntoConstraints = YES, por lo que NSLayoutConstraint: 0x7b65f900 ''UIView-Encapsulated-Layout-Height'' V: [UIView: 0x7b0b7000 (0)] apareció y me ocasionó algunos problemas. Agregar el atributo de tiempo de ejecución traduceAutoresizingMaskIntoConstraints = NO y solucionará el problema.
En lugar de configurar manualmente contentView
en la contentView
de contentView
de la celda o ajustando manualmente el alto de esta vista, solo debe establecer estimatedRowHeight
y rowHeight
para la vista de tabla, como se explica en WWDC 2014 video Novedades en las vistas de tabla y colección :
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.estimatedRowHeight = 44;
self.tableView.rowHeight = UITableViewAutomaticDimension;
}
Luego, las restricciones totalmente calificadas que aplique a esa celda ajustarán la altura de la fila y eliminarán esas advertencias molestas.
Estos problemas ocurren cuando hay un choque entre la restricción.
En su caso, ya ha otorgado la restricción superior / inferior principal / final a la vista de tabla interna, que cumple la restricción requerida para la vista de tabla, por lo que no es necesario proporcionar una restricción más (restricción de altura fija con constante 0).
NSLayoutConstraint:0x7b03e5f0 V:[UITableView:0x7c42a200(54)], NSLayoutConstraint:0x7b0ba120 V:|-(0)-[UITableView:0x7c42a200]
encima de dos líneas significa que hay algún choque en dirección vertical para la vista de tabla que tiene constante 0.
Dos formas en que puedes resolver esto,
1 - Eliminar la restricción de altura, establecer la restricción inferior a cero initaily. Tome una salida de la restricción de fondo y establezca el valor de restricción de fondo dinámicamente.
2 - Eliminar la restricción de espacio inferior, establecer la restricción de altura a cero. Tome una salida de restricción de altura y configure la altura de la vista de tabla dinámicamente.
Espero que esto te ayudará.
Acompasándote con una de las formas más fáciles de resolver esto: solo baja la prioridad de la regla de autodiseño que está vinculada al borde inferior de tu vista de contenedor.
Aquí está mi contenedor:
Le digo a esa vista de imagen que siga el borde inferior del contenedor, y eso me causaba un conflicto. Para solucionarlo, puedo bajar la prioridad de esa regla de borde inferior:
Digo "abajo" porque, en mi opinión, es probable que tenga un conflicto con eso, pero podría ser cualquier borde que establezca implícitamente un ancho en su contenedor.
Finalmente resuelvo este problema.
1. En su configuración tableView, establezca: tableView.estimatedRowHeight = 100
.
2. En la última vista de su celda, establezca: make.bottom.equalTo(contentView).priority(999)
.
3. Ejecute su código, ¡quizás esté bien!