ios - Extraño UIView-Encapsulated-Layout-Height Error
objective-c uitableview (7)
Estoy haciendo una aplicación de prueba, así que en mi TableViewCell en el guión gráfico tengo imageView y webView (para mostrar html-text). Establecí restricciones como top / left / right / height = 200 para imageView, spacing = 5 entre ellas y left / right / bot para webView, por lo que quiero calcular mi altura de webView programmatically y luego cambiar heigt de celda para estirar mi webView. Pero tengo esto:
Incapaz de satisfacer restricciones simultáneamente.
Probablemente al menos una de las restricciones en la siguiente lista es una que no desea.
Prueba esto:
(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 & fix it. (Note: If you''re seeing NSAutoresizingMaskLayoutConstraints that you don''t understand, refer to the documentation for the UIView property
translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fd6f3773f90 V:[UIImageView:0x7fd6f3773e90(200)]>",
"<NSLayoutConstraint:0x7fd6f3774280 UIImageView:0x7fd6f3773e90.top == UITableViewCellContentView:0x7fd6f3462710.topMargin>",
"<NSLayoutConstraint:0x7fd6f3774320 V:[UIImageView:0x7fd6f3773e90]-(5)-[UIWebView:0x7fd6f3462800]>",
"<NSLayoutConstraint:0x7fd6f3774370 UITableViewCellContentView:0x7fd6f3462710.bottomMargin == UIWebView:0x7fd6f3462800.bottom>",
"<NSLayoutConstraint:0x7fd6f375ee40 ''UIView-Encapsulated-Layout-Height'' V:[UITableViewCellContentView:0x7fd6f3462710(205)]>"
)
¿Alguna sugerencia?
Estaba tratando de implementar una celda simple con una etiqueta superior de una línea y una etiqueta inferior en n línea que se expandiría con texto más largo, con la esperanza de que la celda se expandiera automágicamente para ajustarse al contenido en función de mis limitaciones.
Curiosamente para mí, la solución para esto fue anular - tableView:heightForRowAtIndexPath:
y tableView:estimatedHeightForRowAtIndexPath:
y devolver mi altura de fila estimada y UITableViewCellAutomaticDimension
lugar de establecer rowHeight
y estimatedRowHeight
en mi tableView en viewDidLoad:
Este error me ha ocurrido con un UIButton
intentando ajustar automáticamente su altura creando un UIView-Encapsulated-Layout-Height
que entra en conflicto con mis restricciones superiores e inferiores.
Lo arreglé agregando explícitamente una restricción de altura.
Hoy corro en este problema. Tenía una vista de colección en la pantalla, pero ese no era el problema. Estaba usando un controlador de vista de contenedor personalizado y algunas vistas se presentaron antes de que la vista del contenedor se desplegara. El truco consistía en asegurarse de que la vista de contenedor se distribuyera primero llamando a loadViewIfNeeded()
en el controlador de vista de contenedor.
Eso significa que si 0x7fd6f375ee40
de la pregunta original es la vista de un controlador de vista, es posible que deba verificar si está cargando esa jerarquía de vistas antes de que algunas subvistas se presenten.
Lamento haber llegado tarde al juego. :)
Bajar la prioridad de la restricción que está intentando romper Autolayout podría no ser la solución si la restricción se requiere en primer lugar.
Tuve este problema el otro día, así es como se veía mi diseño:
- OuterView <- C1: una restricción de ancho igual a su superview
- StackView <- C2: una restricción de ancho igual a OuterView
- ChildView <- C3: una restricción de ancho fijo, constante = StackView.frame.size.width
- StackView <- C2: una restricción de ancho igual a OuterView
El problema ocurrió cuando estaba reduciendo el ancho de C1, obviamente porque C3 tenía un ancho fijo que tomaba el tamaño de fotograma original, lo que reducía los conflictos causados por C1 y C1 se rompía con iOS para solucionar el problema.
El problema se solucionó rápidamente configurando C3 para tomar Anclaje de ancho de StackView en lugar de su tamaño de marco.
Restricción incorrecta
view.widthAnchor.constraint(equalToConstant: stackView.frame.size.width).isActive = true
Restricción correcta
view.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1.0).isActive = true
De esta forma, cada vez que C1 cambie, todas las restricciones secundarias reaccionarán en consecuencia.
Conclusión:
- No creo que este error haya sido un error, como afirman algunos.
- Resolver ajustando la prioridad funciona, pero ¿es ese el resultado deseado?
- Si está decidido a resolverlo sin prioridad, mire sus limitaciones, especialmente las establecidas programáticamente, para verificar conflictos. Si está tratando con ancho o alto dinámico para sus vistas, como vistas de celda, asegúrese de que la restricción de altura o ancho de la vista principal no entre en conflicto con estos cambios dinámicos y simplemente siga trabajando hacia arriba.
Normalmente elimino esta advertencia al disminuir la prioridad de la restricción que AutoLayout
está tratando de romper. Entonces, si dice:
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fd7c2ecb520 V:[UIView:0x7fd7c2ecd0e0(300)]>
Siga adelante y baje esa prioridad a 999
.
Eso debería funcionar.
Aclamaciones.
Para mí utilizo la altura estimada para las celdas, y para resolver este problema, configuré la prioridad de la restricción desde la parte inferior de la etiqueta hasta su vecino en 999 y funcionó.
si usa tableView.rowHeight = UITableViewAutomaticDimension
, siempre debe establecer estimatedRowHeight
. Por ejemplo:
tableView.estimatedRowHeight = 44
o deberías implementar:
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
de lo contrario, siempre recibirá la advertencia UIView-Encapsulated-Layout-Height'' V:[UITableViewCellContentView
y el contenido se colapsará de forma incorrecta