¿Forma correcta de actualizar las restricciones de progtwigción cuando cambia la orientación del dispositivo?

Estoy usando storyboard y autolayout , y configurando las restricciones en IB como IBOutlet en el controller de vista correspondiente. Estoy leyendo varias publicaciones sobre cómo actualizar las restricciones para que sean diferentes en retrato y en paisaje, pero todavía no estoy seguro de cómo debo hacer esto:

  1. ¿Debo establecer las nuevas restricciones en -viewWillTransitionToSize:withTransitionCoordinator: method, o en el método updateViewConstraints ?
  2. Cuando se establecen las nuevas restricciones, debo llamar a [self.view setNeedsUpdateConstraints]; , o layoutIfNeeded o setNeedsLayout ?
  3. ¿Cómo debo actualizar, por ejemplo, la constante de una determinada restricción?

    self.myConstraint.constant = 30.0

o haciendo:

 [self.view removeConstraint:self.passwordViewHeight]; self.passwordViewHeight = [NSLayoutConstraint constraintWithItem:self.passwordView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:34.0]; [self.view addConstraint:self.passwordViewHeight]; 

Gracias por adelantado

El cambio de orientación se detecta mediante el método viewWillTransitionToSize. Este método se llamará cuando la orientación del dispositivo esté a punto de cambiar.

 -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator (id<UIViewControllerTransitionCoordinator>)coordinator{ //change constraints } 

Alternativamente, si desea cambiar las restricciones después de que cambie la orientación, utilice el método animateAlongsideTransition del object coordinador en el método viewWillTransitionToSize.

 -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{ [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { //change constraints }]; } 

La mejor manera sería cambiar la constante en lugar de eliminar la restricción y volver a crearla. Agregar y restar de la constante también es mucho más rápido en el largo ploop. Lo que querrías hacer es algo así como:

 [self.view layoutIfNeeded]; self.myConstraint.constant = 30.0; [self.view layoutIfNeeded]; 

Se recomienda que llame a layoutIfNeeded antes y después de cambiar la constante también. Esto se debe a que es posible que tenga alguna restricción que aún no se haya hecho y que lo hará, antes de cambiar más restricciones.

La mejor idea será usar Size Classes en Interface Builder para lograr el cambio de autorotation.

https://www.codefellows.org/blog/size-classes-with-xcode-6-one-storyboard-for-all-sizes