Copiar restricciones creadas por IB en otra vista UIV

Tengo listdo UITableView junto con otros elementos de vista en una pantalla. Planeo cambiar esta list con otra vista cuando no hay transactions para mostrar. Para esto, necesito copyr todas las restricciones adjuntas a UITableView y agregarlas a la nueva UIView .

Captura de pantalla

He intentado copyr los valores de propiedad de .constraints() pero devuelve nil porque las restricciones se adjuntan a superview. Obtener restricciones de superview rinde todas las restricciones asociadas a otras subvistas también.

¿Hay una manera rápida de copyr y agregar restricciones de una UIView a otra?

No hay manera rapida

Lo he hecho con un ciclo:

 + (void)copyConstraintsFromView:(UIView *)sourceView toView:(UIView *)destView { for (NSLayoutConstraint *constraint in sourceView.superview.constraints) { if (constraint.firstItem == sourceView) { [sourceView.superview addConstraint:[NSLayoutConstraint constraintWithItem:destView attribute:constraint.firstAttribute relatedBy:constraint.relation toItem:constraint.secondItem attribute:constraint.secondAttribute multiplier:constraint.multiplier constant:constraint.constant]]; } else if (constraint.secondItem == sourceView) { [sourceView.superview addConstraint:[NSLayoutConstraint constraintWithItem:constraint.firstItem attribute:constraint.firstAttribute relatedBy:constraint.relation toItem:destView attribute:constraint.secondAttribute multiplier:constraint.multiplier constant:constraint.constant]]; } } } 

Recuerde solo copyr restricciones después de agregar destView a la jerarquía de la vista.

Lo mismo en Swift:

 static func copyConstraints(fromView sourceView: UIView, toView destView: UIView) { guard let sourceViewSuperview = sourceView.superview else { return } for constraint in sourceViewSuperview.constraints { if constraint.firstItem as? UIView == sourceView { sourceViewSuperview.addConstraint(NSLayoutConstraint(item: destView, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: constraint.secondItem, attribute: constraint.secondAttribute, multiplier: constraint.multiplier, constant: constraint.constant)) } else if constraint.secondItem as? UIView == sourceView { sourceViewSuperview.addConstraint(NSLayoutConstraint(item: constraint.firstItem, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: destView, attribute: constraint.secondAttribute, multiplier: constraint.multiplier, constant: constraint.constant)) } } } 

No, no hay nada integrado en el sistema para esto.

El object NSLayoutConstraint es inmutable excepto por su prioridad constant , por lo que una vez que se crea el object no puede simplemente aplicar la "misma" restricción a otra vista (donde "lo mismo" significa identidad de object o igualdad de object).

Si el performance lo permite, en lugar de configurar y derribar vistas con todas sus restricciones, acabo de configurar tanto la vista de tabla como las vistas de contraparte sin datos como hermanos, usando una function auxiliar para instalar restricciones equivalentes en cada una, de modo que están dispuestas de forma idéntica, pero con una encima de la otra. Entonces, simplemente cambiaría qué vista es visible con la propiedad hidden .

Sin embargo, si realmente desea duplicar las restricciones de una vista en otra vista, en el time de ejecución, de manera general, tendrá que escribir un método de utilidad que realice una búsqueda recursiva a partir de la supervista más ancestral que podría tener alguna restricción que afecte al view-being-copied, y crea una restricción duplicada aplicada a la otra vista. Tal function ya puede escribirse en una de las bibliotecas auxiliares de AL, como FLKAutoLayout.