Mover vistas con restricciones

Tengo un par de vistas en mi controlador de vista que se mueven hacia arriba cuando se detecta un barrido hacia arriba y luego hacia abajo cuando se detecta un barrido hacia abajo. Estaba obligando a las vistas a moverse ajustando el origen y usando CGRectOffset. Ahora he aplicado restricciones a mis puntos de vista con IB y no estoy seguro de cuál es la mejor manera de mover las vistas para que terminen en la posición correcta en el iPhone 5, 6 y 6+.

Actualmente estoy haciendo algo como esto:

[self.view layoutIfNeeded]; self.panFrameVerticalConstraint.constant = self.panFrameVerticalConstraint.constant +338; [UIView animateWithDuration:5 animations:^{ [self.view layoutIfNeeded]; }]; 

¿Es mejor cambiar las constantes usando ratios? Entonces, para la restricción anterior, en lugar de usar 338, ¿sería mejor hacer esto?

  self.panFrameVerticalConstraint.constant = self.panFrameVerticalConstraint.constant + (self.panView.frame.size.height/1.680); //self.panView.frame.size.height = 568 //(568/1.680) = 338 

Sí, no hay problema cuando cambias las constantes. El problema aquí es que debe establecer su restricción de manera apropiada.

Consideremos un ejemplo.

Tengo una UIView en Storyboard y me gustaría cambiar su ancho. Su ancho predeterminado es 1024 .

Después de algunas animaciones, cambiaremos su ancho a 900 .

Siga los pasos a continuación para lograr esto:

  1. Seleccione UIView en el que queremos actualizar las restricciones. Aquí tenemos que actualizar el width , entonces agregaremos una restricción para el ancho.

enter image description here

  1. Ahora podemos ver nuevas restricciones añadidas a UIView .

enter image description here

  1. Haga clic en esa restricción. Mostrará las propiedades de restricción. Aquí ahora queremos disminuir el ancho de 1024 a 900, para que en la propiedad de restricción cambie la propiedad de Relación a Menor que o igual . De forma similar, si desea boost el ancho desde 1024, la relación será mayor que o igual .

enter image description here

  1. Ahora crea una variable IBOutlet para NSLayoutConstraint y NSLayoutConstraint con la restricción de ancho anterior.

La variable se verá así:

En el Objetivo C:

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewWidthConstraint; 

En Swift:

 @IBOutlet weak var viewWidthConstraint : NSLayoutConstraint! 
  1. Cambiar ancho constante:

Reduce constante usando el código a continuación:

C objective:

 // Reduce width of view. [UIView animateWithDuration:0.35f animations:^{ self.viewWidthConstraint.constant = 900; [self.view layoutIfNeeded]; }]; 

Swift 4.0:

 // Reduce width of view. UIView.animate(withDuration: 0.35, animations: { () -> Void in self.viewWidthConstraint.constant = 900 self.view.layoutIfNeeded() }) 

Y de manera similar, podemos cambiarlo al valor predeterminado:

C objective:

 // Change to default width of view. [UIView animateWithDuration:0.35f animations:^{ self.viewWidthConstraint.constant = 1024; [self.view layoutIfNeeded]; }]; 

Swift 4.0:

 // Change to the default width of view. UIView.animate(withDuration: 0.35, animations: { () -> Void in self.viewWidthConstraint.constant = 1024 self.view.layoutIfNeeded() })