Nunca he trabajado con restricciones de autolayout antes. Tengo una nueva aplicación pequeña en la que estoy trabajando y noté que las vistas de la NIB están predeterminadas para la distribución automática. Entonces, pensé que aprovecharía la oportunidad para trabajar con él e intentar averiguar a dónde va Apple con esto.
Primer desafío:
Necesito cambiar el tamaño de un MKMapView y me gustaría animarlo a la nueva posición. Si hago esto como estoy acostumbrado:
[UIView animateWithDuration:1.2f
animations:^{
CGRect theFrame = worldView.frame;
CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170);
worldView.frame = newFrame;
}];
... entonces el MKMapView se 'ajustará' a su altura original cada vez que se actualice una vista de hermanos (en mi caso, se está actualizando el título de un UISegmentedControl [myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0]
).
Entonces, lo que creo que quiero hacer es cambiar las restricciones de MKMapView de ser igual a la altura de la vista principal a ser relativa a la parte superior del control UISegmentedControl que estaba cubriendo:V:[MKMapView]-(16)-[UISegmentedControl]
Lo que quiero es que la altura de MKMapView se acorte para que se revelen algunos controles debajo de la vista del mapa. Para hacerlo, creo que necesito cambiar la restricción de una vista fija de tamaño completo a una donde la parte inferior esté restringida a la parte superior de un UISegmentedControl ... y me gustaría animarla a medida que la vista se reduce a un nuevo tamaño.
¿Cómo se hace esto?
Editar - esta animación es no animando a pesar de la parte inferior de la vista se mueve hasta 170 al instante:
[UIView animateWithDuration:1.2f
animations:^{
self.nibMapViewConstraint.constant = -170;
}];
y nibMapViewConstraint
está conectado en IB a la restricción de espacio vertical inferior.
fuente
Respuestas:
Después de actualizar su restricción:
Reemplace
self.view
con una referencia a la vista que lo contiene.fuente
UIViewAnimationOptionBeginFromCurrentState
diseño, las restricciones se establecerán ANTES de la animación.layoutIfNeeded
a cada uno de esos puntos de vista, sólo tiene que llamar[[self.view superview] layoutIfNeeded];
UIViewAnimationOptionBeginFromCurrentState
.Esto funciona para mí (tanto iOS7 como iOS8 +). Haga clic en la restricción de diseño automático que desea ajustar (en el generador de interfaces, por ejemplo, la restricción superior). Luego haga de esto un IBOutlet;
Animar hacia arriba;
Animar de vuelta al lugar original
fuente
Hay un muy buen tutorial de Apple que explica cómo usar la animación con autolayout. Siga este enlace y luego encuentre el video llamado "Diseño automático por ejemplo". Ofrece algunas cosas interesantes sobre la distribución automática y la última parte trata sobre cómo usar la animación.
fuente
He hecho esta pequeña demostración disponible . Muestra cómo se pueden cambiar y animar las restricciones de diseño automático en un ejemplo muy simple. Simplemente eche un vistazo a DemoViewController.m .
fuente
La mayoría de las personas usa la distribución automática para diseñar elementos en sus vistas y modificar las restricciones de diseño para crear animaciones.
Una manera fácil de hacer esto sin mucho código es crear la UIView que desea animar en Storyboard y luego crear una UIView oculta donde desea que termine la UIView. Puede usar la vista previa en xcode para asegurarse de que ambas UIViews estén donde desea que estén. Después de eso, oculte la UIView final e intercambie las restricciones de diseño.
Hay un archivo de pod para intercambiar restricciones de diseño llamado SBP si no desea escribirlo usted mismo.
Aquí hay un tutorial .
fuente
No es necesario usar más
IBOutlet reference
de la restricción en lugar de esto, puede aplicar la restricción directamenteaccess
oupdate
ya sea aplicada porProgrammatically
o desdeInterface Builder
cualquier vista usando laKVConstraintExtensionsMaster
biblioteca. Esta biblioteca también gestiona elCumulative
comportamiento deNSLayoutConstraint
.Para agregar restricción de altura en containerView
Para actualizar la restricción de altura de containerView con animación
fuente