ios objective-c swift autolayout nslayoutconstraint

ios - Mover vistas con restricciones



objective-c swift (1)

Sí, no hay problema cuando cambia las constantes. Lo que ocurre aquí es que debes establecer tu restricción de manera adecuada.

Consideremos un ejemplo.

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

Después de un poco de animación, 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í necesitamos actualizar el width , por lo que agregaremos una restricción para el ancho.

  1. Ahora podemos ver una nueva restricción añadida a UIView .

  1. Haga clic en esa restricción. Mostrará 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 o Igual . Del mismo modo, si desea aumentar el ancho desde 1024, entonces la relación será mayor o igual .

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

  2. Cambiar ancho constante

Swift 5.0

@IBOutlet weak var viewWidthConstraint : NSLayoutConstraint! func reduceWidth() { // Reduce width of view. UIView.animate(withDuration: 0.35, animations: { () -> Void in self.viewWidthConstraint.constant = 900 self.view.layoutIfNeeded() }) } func normalWidth() { // Change to the default width of view. UIView.animate(withDuration: 0.35, animations: { () -> Void in self.viewWidthConstraint.constant = 1024 self.view.layoutIfNeeded() }) }

C objetivo

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewWidthConstraint; - (void) reduceWidth { // Reduce width of view. [UIView animateWithDuration:0.35f animations:^{ self.viewWidthConstraint.constant = 900; [self.view layoutIfNeeded]; }]; } - (void) normalWidth { // Change to default width of view. [UIView animateWithDuration:0.35f animations:^{ self.viewWidthConstraint.constant = 1024; [self.view layoutIfNeeded]; }]; }

Tengo un par de vistas en mi controlador de vista que se mueven hacia arriba cuando se detecta un deslizamiento hacia arriba y luego hacia abajo cuando se detecta un deslizamiento hacia abajo. Estaba obligando a las vistas a moverse ajustando el origen y usando CGRectOffset. Ahora he aplicado restricciones a mis vistas 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 proporciones? 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