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...
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.
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.
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;
}
}
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