español code ios objective-c autolayout

ios - code - ¿Cómo cambiar las restricciones de la etiqueta durante el tiempo de ejecución?



nslayoutconstraint (4)

Coloque las etiquetas que desea ocultar en una vista, una vez que todo tenga las restricciones de diseño 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 propiedades sean strong

en el código, solo tiene que establecer la constante en 0 y activarlo, para ocultar el contenido o desactivarlo para mostrar el contenido. Esto es mejor que arruinar con el valor constante y el ahorro que lo restaura. No olvides 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 configuración, puede probarla en IntefaceBuilder estableciendo su restricción en 0 y luego de vuelta al valor original. No se olvide de verificar las prioridades de otras restricciones para que cuando esté oculto no haya conflicto alguno. Otra forma de probarlo es ponerlo en 0 y establecer la prioridad en 0, pero no debe olvidarse de restablecerlo a la prioridad más alta nuevamente.

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

ACTUALIZACIÓN Max MacLeod respuesta apuntó a la dirección correcta. El truco es empujar la etiqueta del encabezado hacia abajo cuando la primera y la segunda etiquetas están ocultas. Por lo tanto, debemos configurar el espacio inferior en la vista de contenedor para las etiquetas primera y segunda en lugar de crear un espacio superior en la vista de contenedor para la etiqueta de encabezado. Y el ocultamiento / ocultación se debe hacer teniendo salidas de altura (restricciones de altura para la primera y segunda etiquetas) y estableciendo sus valores constantes en cero (y estableciendo el valor de retroceso cuando se desmarque). También subí el ejemplo del código fuente a Github .


Estoy haciendo algo muy parecido a esto yo mismo. Así que agregue una restricción de ancho a ambas etiquetas. Se le permite cambiar el valor constante mientras se aplica la restricción, solo mantenga una referencia a él. En mi caso, tengo una matriz en la que coloco las restricciones que planeo cambiar.

Cuando desee ocultar las etiquetas, cambie el valor c a 0; también puede hacerlo en un bloque de animación. Para mostrar cambiar el valor.

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

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


Rara vez se pueden encontrar ejemplos fáciles y fáciles de entender cuando se trata de la documentación de Apple, pero este es el caso exacto de la excepción en la regla.

Personalmente, encontré este documento tan fácil de entender y tan claro. La mejor manera de convertirte en un gurú de diseño automático a tiempo :)

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

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

Así que la respuesta a su pregunta se encuentra aquí:

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


Seleccione la etiqueta del encabezado y una de las etiquetas inferiores, y agregue una nueva restricción de espacio vertical que refleje el espacio entre ellas. A continuación, elimine la restricción del espacio superior de la etiqueta del encabezado al contenedor. Tal vez ya tienes esto ( no puedo verlo en la pantalla ). Si lo haces, eso es bueno.

Ahora, crea dos restricciones de altura para cada etiqueta inferior. IBOutlet esos a tu clase.

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

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

Repasaré los pasos una vez más (¡ fue demasiado largo para un comentario! ). La secuencia importa con 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 IB no permite la ambigüedad. Entonces, primero agregue la nueva restricción de espacio vertical. Eso definirá la posición Y de la etiqueta superior. Luego, elimine el espacio vertical superfluo para restringir el contenedor de la etiqueta superior. Ahora esa etiqueta se posicionará en Y utilizando el espacio vertical relativo a las etiquetas inferiores. A continuación, agregue las restricciones de altura para cada etiqueta inferior y vincule a la clase con un IBOutlet. Otra cosa, en realidad, necesitará que las etiquetas inferiores estén restringidas al contenedor con una restricción de espacio inferior. Cuando su altura se reduzca a cero, desaparecerán y la etiqueta superior se moverá hacia abajo para asumir la posición central Y.

Para revertir, simplemente vuelva a establecer la constant en el valor original.

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

Ver también mi respuesta AutoLayout con UIViews ocultas?