¿Cómo cambiar las restricciones de label durante el time de ejecución?

Tengo una vista de tabla y una celda dentro. La celda contiene tres tags: label de encabezado y dos tags debajo de una entre sí. A veces, necesito ocultar esas dos tags a continuación si no contienen datos y cambiar "Espacio superior a contenedor" de "Etiqueta de encabezado" a "Centro Y a contenedor". Y, por supuesto, revertir las restricciones cuando dos tags contienen datos. Aquí hay una captura de pantalla del proyecto simple de demostración solo para mostrar la idea:

introduzca la descripción de la imagen aquí

ACTUALIZACIÓN La respuesta de Max MacLeod apuntaba hacia la dirección correcta. El truco consiste en presionar la label del encabezado cuando se ocultan las tags primera y segunda. Por lo tanto, debemos establecer el espacio inferior en la vista de contenedor para las tags primera y segunda en lugar de crear espacio superior para la vista de contenedor para la label de encabezado. Y ocultar / desincrustar debe hacerse teniendo salidas de altura (restricciones de altura para la primera y segunda label) y estableciendo sus valores constantes en cero (y restableciendo el valor cuando se deja de ocultar). También subí el ejemplo del código fuente a Github .

Seleccione la label del encabezado y una de las tags más bajas y agregue una nueva restricción de espacio vertical que refleje el espacio entre ellas. A continuación, quite la label del encabezado Espacio superior a la restricción del contenedor. Tal vez ya tenga esto ( no se puede ver por la captura de pantalla ). Si lo haces, eso está bien.

Ahora, cree dos restricciones de altura para cada label inferior. IBOutlet los de su class.

Luego, oculte esas dos tags inferiores siempre que lo necesite, estableciendo la constant cada restricción de altura en 0.f

Eso los hará invisibles y bajará la label del encabezado anterior para que ahora esté verticalmente cinput Y en el contenedor.

Pasará por los pasos una vez más (¡ fue demasiado largo para un comentario! ). La secuencia es importante para IB, ya que primero debe agregar una nueva restricción antes de poder eliminar la anterior. Temporalmente tendrás una restricción superflua. Es porque el IB no permitirá la ambigüedad. Entonces, primero agregue la nueva restricción de espacio vertical. Eso definirá la position Y de la label superior. Luego, elimine el espacio vertical superfluo a la restricción del contenedor de la label superior. Ahora esa label será Y colocada usando el espacio vertical en relación con las tags inferiores. A continuación, agregue las restricciones de altura para cada label inferior y enlace a la class con un IBOutlet. Otra cosa, en realidad, necesitará que las tags inferiores se vean restringidas al contenedor con una restricción de espacio inferior. Cuando su altura se networkinguce a cero, desaparecerán y la label superior se moverá hacia abajo para asumir la position del centro Y.

Para revertir, simplemente establezca la constant en el valor original.

Este es un enfoque mucho mejor que agregar / eliminar restricciones, que es una operación pesada. Tenga en count que es posible que desee agregar las dos tags inferiores a una vista de "contenedor", para que se puedan mostrar / ocultar como una sola. Además, orderaría el código ya que realmente desea que el espacio vertical esté entre su label superior, y ambas tags más bajas en lugar de una sola.

¿Ves también mi respuesta AutoLayout con UIViews ocultas?

Coloque las tags que desea ocultar en una vista, una vez que todo tenga las restricciones de layout correctas, agregue una restricción de altura a la vista de contenedor y conecte la restricción en una propiedad IBOutlet .

Asegúrate de que tus properties sean strong

en el código, solo tiene que establecer la constante en 0 y activarlo, esconder el contenido o desactivarlo para mostrar el contenido. Esto es mejor que echar a perder con el valor constante un ahorro-restaurarlo. No olvide llamar a layoutIfNeeded después.

 @property (strong, nonatomic) IBOutlet UIView *myContainer; @property (strong, nonatomic) IBOutlet NSLayoutConstraint *myContainerHeight; //should be strong!! 

 -(void) showContainer { self.myContainerHeight.active = NO; self.myContainer.hidden = NO; [self.view layoutIfNeeded]; } -(void) hideContainer { self.myContainerHeight.active = YES; self.myContainerHeight.constant = 0.0f; self.myContainer.hidden = YES; [self.view layoutIfNeeded]; } 

Una vez que tenga su configuration, puede probarla en IntefaceBuilder estableciendo su restricción en 0 y luego volviendo al valor original. No se olvide de verificar otras prioridades de las restricciones, por lo que cuando está oculto no hay ningún conflicto en absoluto. Otra forma de probarlo es colocarlo en 0 y establecer la prioridad en 0, pero no debe olvidarse restaurarla a la máxima prioridad nuevamente.

Estoy haciendo algo muy parecido a esto yo mismo. Entonces agregue una restricción de ancho a ambas tags. Se le permite cambiar el valor constante mientras se aplica la restricción, solo mantenga una reference a la misma. En mi caso, tengo una matriz en la que pongo las restricciones que planeo cambiar.

Cuando quiera esconder las tags, cambie el valor c a 0; también puede hacer esto en un bloque de animation. Para mostrar el cambio del valor.

También puede hacer que el ancho del espacio superior sea igual al espacio inferior, de modo que cuando las vistas se oculten o muestren mantener centrado el "grupo" de elementos.

Tenga en count que también puede agregar o eliminar restricciones, pero es más costoso para iOS.

Raramente se puede entender fácilmente y algunos ejemplos prácticos cuando corresponde a la documentation de Apple, pero este es el caso exacto de la exception en la regla.

Personalmente, encontré este documento tan fácil de entender y tan claro. La mejor manera de convertirte en un gurú de layout automático a time 🙂

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutinCode/AutoLayoutinCode.html

Básicamente, el time de ejecución significa "programáticamente".

Entonces, la respuesta a tu pregunta está aquí:

https://stackoverflow.com/a/12623006/517119