iOS cambiar restricciones de diseño automático cuando el dispositivo gira


Quiero modificar las restricciones de diseño cuando el dispositivo gira. Mi UIViewController se compone de 2 UIViews, en paisaje están alineados horizontalmente, y en retrato están alineados verticalmente.

Realmente funciona, en willAnimateRotationToInterfaceOrientation, elimino las restricciones deseadas y las reemplacé con otras para tener el diseño correcto...

Pero hay problemas, durante la rotación el diseño automático comienza a romper las restricciones antes de que se llame a willAnimateRotationToInterfaceOrientation, por lo que ¿dónde estamos destinados a reemplazar nuestras restricciones ¿cuándo se produce la reorientación del dispositivo ?

Otro problema es el rendimiento, después de algunas rotaciones el sistema no rompe más restricciones, pero tengo una gran caída de rendimiento, especialmente en el modo retrato...

Author: Comradsky, 2012-12-06

3 answers

En willRotateToInterfaceOrientation:duration:, envíe setNeedsUpdateConstraints a cualquier vista que necesite modificar sus restricciones.

Alternativamente, crea una subclase UIView. En tu subclase, regístrate para recibir UIApplicationWillChangeStatusBarOrientationNotification. Cuando reciba la notificación, envíese setNeedsUpdateConstraints.

Esto establece la bandera needsUpdateConstraints en la vista. Antes de que el sistema realice layout (enviando mensajes layoutSubviews), envía un mensaje updateConstraints a cualquier vista que tenga el indicador needsUpdateConstraints establecido. Aquí es donde debe modificar sus restricciones. Hacer una subclase UIView y override updateConstraints para actualizar sus restricciones.

 50
Author: rob mayoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-25 07:31:54

Hay una muy buena explicación del auto-layout y las rotaciones en el post de Matthijs Hollemans. Puedes encontrarlo aquí: http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

Por lo general, necesita alrededor de 4 restricciones para posicionar correctamente su vista. Si mis vistas tienen un tamaño constante, prefiero fijar la altura y el ancho. Después de eso, puede usar las restricciones de espacio principales y superiores para hacer lo que quiera. Por ejemplo, puede establecer IBOutlets para restricciones de espacio iniciales y superiores para sus puntos de vista:

@interface ViewController : UIViewController {
    IBOutlet NSLayoutConstraint *_leadingSpaceConstraint;
    IBOutlet NSLayoutConstraint *_topSpaceConstraint;
}

Entonces control-arrastre desde outlet a su restricción. Ahora puede cambiar directamente su restricción de vista desde el código:

_leadingSpaceConstraint.constant = NEW_CONSTRAINT_VALUE;

Para confirmar tus cambios necesitas llamar a:

[self.view layoutIfNeeded];

Y si quieres hacerlo animado:

[UIView animateWithDuration:0.25
                 animations:^{
                     [self.view layoutIfNeeded];
                 }];

Creo que funcionará en willAnimateRotationToInterfaceOrientation, porque no es necesario romper ninguna restricción con este enfoque.

Algunos ejemplos: Tiene dos vistas cuadradas en orientación vertical, una debajo otro. Establezca sus restricciones de "espacio inicial a superview" en 20, por ejemplo. A continuación, establezca "espacio superior a restricción superview" a 20 para la primera vista y a 120 para la segunda. Será nuestra configuración predeterminada.

Luego, después de la rotación, debe recalcular sus restricciones. Ahora establezca las dos restricciones principales en 20 y las restricciones principales en 20 y 120 respectivamente. A continuación, confirme los cambios con layoutIfNeeded.

Espero que ayude.

 13
Author: Flar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-25 07:21:57

Anular -(void) viewWillLayoutSubviews en su UIViewController para actualizar sus restricciones como el siguiente código:

-(void) viewWillLayoutSubviews {
     switch(self.interfaceorientation)
     {
          case UIInterfaceOrientationLandscapeLeft:

              break;
          case UIInterfaceOrientationLandscapeRight:

              break;

          case UIDeviceOrientationPortrait:

              break;

          case UIDeviceOrientationPortraitUpsideDown:

              break;

     }
}
 2
Author: MuhammadBassio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-04 12:23:44