Actualización NSLayoutConstraints después de la presentación de la primera table

  1. UITableViewCell un UITableViewCell personalizado desde una xib
  2. Actualizo un NSLayoutConstraint programáticamente en cellForRowAtIndexPath

La configuration automática y el cambio manual de NSLayoutConstraint funcionan como deberían: tamaño del dispositivo, orientación, etc.

PERO: en la PRIMERA presentación de la celda, los cambios programáticos no se muestran.
Cambiando vistas y volviendo actualizaciones como se esperaba.

Creo que necesito poner [self setNeedsUpdateConstraints] alguna parte.
viewDidAppear, didEndDisplayingCell ... todo tipo de lugares ( viewDidAppear, didEndDisplayingCell ... )

¿Adónde debería ir?

¿Podría ser un nuevo problema de célula / célula reutilizada?

Ya has actualizado (modificado) una restricción, por lo que la vista no necesita tener sus restricciones actualizadas. Lo que necesita es tener su layout actualizado en respuesta al cambio de restricción. Entonces, creo que necesitas hacer [view setNeedsLayout] . Debería hacerse en la vista a la que se agregó la restricción (o la vista de ancestro común de todas las vistas involucradas en la restricción que se modifica). Debería hacerse en el mismo código que modifica la restricción, justo después de modificarla.

Dicho esto, no estoy seguro de que -tableView:cellForRowAtIndexPath: sea ​​un buen lugar para intentar modificar una restricción para la vista que se devuelve. En ese punto, la vista de celda no se ha agregado como una subvista de la tabla. Las restricciones solo se pueden agregar para vistas en la misma jerarquía de vistas.

Por lo tanto, para resumir las cosas, esto es lo que hice para get vistas bien cada vez:

La UIView ahora es responsable por sí misma, sin perder el time en tableviewController.

No necesitaba llamar (anular) updateConstraints a cualquier lugar que tenga sentido desde que configuré las restricciones en IB y simplemente agregué una propiedad para poder cambiar una constante. ¡Las restricciones reales se dejaron intactas y solo se necesitó un layout!

  1. Movió todo el código de disposition a mi subclass UITableViewCell, lo nombró (vacío) updateMedian (solo dos líneas de código).
  2. Hizo una propiedad para pasar información (un flotante básico) necesaria para el recálculo de la position de la label en la subclass.
  3. Usado (vacío) updateMedian en layout (vacío) Vistas de la subclass UITable ViewCell para actualizar mis coorderadas.
  4. También se agregó una llamada a (vacío) updateMedian y [self layoutIfNeeded] en (void) prepareForReuse en mi subclass.
  5. Se agregó [cell setNeedsLayout]; [cell layoutIfNeeded] en cellForRowAtIndexPath en my tableviewController.

Supongo que el último paso es un poco networkingundante. Pero de lo contrario, todavía había algunas celdas que se mostraban incorrectamente.

Subclass UITableViewCell y call setNeedsLayout en awakeFromNib:

También puede mover restricciones de actualización al método updateConstraints la celda, haciendo que su UITableViewController un poco más pequeño. Después de todo, una celda es una UIView separada y debería saber cómo UIView , no el controller de vista de tabla.

De tu pregunta, lo que obtengo es como

Si puede haber proporcionado restricciones al object desde el guión gráfico utilizando el pin, entonces establecerá esas restricciones para el object y si ha agregado la restricción programáticamente en "cellForRowAtIndexPath:", sobrepasará las restricciones que estableció en el guion gráfico. Es posible que los haya configurado solo para una sola célula por error, por lo que podría estar mostrando efecto en una sola celda.

¿Puedes intentar la siguiente solución y comprobar si te ayuda? Coloque este código en el método cellForRow.

He implementado

 NSDictionary *viewsDictionary = @{@"networkingView":cell.lblText}; NSArray *constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[networkingView(10)]" options:0 metrics:nil views:viewsDictionary]; NSArray *constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[networkingView(100)]" options:0 metrics:nil views:viewsDictionary]; [cell addConstraints:constraint_H]; [cell addConstraints:constraint_V]; 

en cellForRowAtIndexPath:

y afectó a todas las filas en la celda y superó las restricciones.

También puede visitar estos enlaces para get más información: http://technet.weblineindia.com/mobile/ui-design-of-ios-apps-with-autolayout-using-constraints-programmatically/ http: //www.thinkandbuild. it / learn-to-love-auto-layout-programmatically /