¿Cómo actualizar la restricción de altura constante de una UIView mediante programación?

102

Tengo un UIViewy configuro las restricciones usando Xcode Interface Builder.

Ahora necesito actualizar esa UIView'sconstante de altura mediante programación.

Hay una función que dice myUIView.updateConstraints(), pero no sé cómo usarla.

Chris Mikkelsen
fuente
Tome salida de la restricción de altura y establezca
programáticamente
puede utilizar este enlace o este enlace para obtener referencias.
Amna Farhan
A continuación se muestra una forma de actualizar restricciones únicas o múltiples. stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran

Respuestas:

217

Seleccione la restricción de altura en el constructor de Interfaces y tome una salida. Entonces, cuando desee cambiar la altura de la vista, puede usar el siguiente código.

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

El método updateConstraints()es un método de instancia de UIView. Es útil cuando establece las restricciones mediante programación. Actualiza las restricciones de la vista. Para más detalles haga clic aquí .

Parth Adroja
fuente
58
Hoy aprendí que las restricciones se pueden convertir en una salida, y desde allí puedo hacer lo que quiera con ellas. Gracias
Chris Mikkelsen
@ParthAdroja, hermano, ¿podrías echar un vistazo a mi pregunta stackoverflow.com/questions/46034278/… ?
Mayo Phyu
No tengo un archivo xib, ¿y cómo configurar yourHeightConstraint en una UIView mediante programación?
Newszer
@newszer, debe buscar otro tema para ese stackoverflow.com/questions/31651022/…
Parth Adroja
Escuché que deberíamos llamar a layoutIfNeeded después de cambiar la restricción constante. ¿por qué? ya veces llamo layoutIfNeeded dentro de viewWillLayoutSubviews y viewDidLayoutSubviews. ¿está bien?
mnemónico
104

Si tiene una vista con múltiples restricciones, una forma mucho más fácil sin tener que crear múltiples salidas sería:

En el generador de interfaces, asigne un identificador a cada restricción que desee modificar:

ingrese la descripción de la imagen aquí

Luego, en el código, puede modificar múltiples restricciones así:

for constraint in self.view.constraints {
    if constraint.identifier == "myConstraint" {
       constraint.constant = 50
    }
}
myView.layoutIfNeeded()

Puede asignar el mismo identificador a varias restricciones, lo que le permite agrupar restricciones y modificarlas todas a la vez.

George Filippakos
fuente
Esto funciona bien, pero me resulta más fácil usar solo una colección de salidas regulares para agrupar las restricciones. Por ejemplo, en la vista con la que estoy trabajando, hay 47 restricciones, pero solo 6 que quiero cambiar en tiempo de ejecución, por lo que es un bucle mucho más pequeño. Esto tampoco requiere mantener las cadenas sincronizadas entre dos lugares diferentes.
Gary Z
1
Gracias George por este consejo. Es una gran ayuda con algunos diseños actuales con los que estoy jugando.
Jim Hillhouse
1
HERMOSO
William Yang
Hola, lo estoy usando de la misma manera, pero nunca va en el caso if y he dado el mismo identificador.
Rob13
Me preguntaba si era posible nombrar la restricción. ¡Gran respuesta!
ShadeToD
35

Cambiar HeightConstrainty WidthConstraintsin crear IBOutlet.

Nota: Asigne una restricción de altura o ancho en el archivo Storyboard o XIB. después de obtener esta restricción usando esta extensión.

Puede usar esta extensión para obtener una restricción de altura y ancho:

extension UIView {

var heightConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .height && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

var widthConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .width && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

}

Puedes usar:

yourView.heightConstraint?.constant = newValue 
AshvinGudaliya
fuente
2
Hay un método first(where: ...)que podría usar inmediatamente en lugar de filter+first
Vyachaslav Gerchicov
13

Arrastre la restricción a su VC como un IBOutlet. Luego puede cambiar su valor asociado (y otras propiedades; consulte la documentación):

@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!

func updateConstraints() {
    // You should handle UI updates on the main queue, whenever possible
    DispatchQueue.main.async {
        self.myConstraint.constant = 10
        self.myView.layoutIfNeeded()
    }
}
Dylanthelion
fuente
9

Puede actualizar su restricción con una animación suave si lo desea, vea el fragmento de código a continuación:

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})
Hafiz Muhammad Farooq Rasheed
fuente
4

Si el método anterior no funciona, asegúrese de actualizarlo en el bloque Dispatch.main.async {}. No es necesario llamar al método layoutIfNeeded () entonces.

Nupur Sharma
fuente
4

Primero conecte la restricción de altura a nuestro controlador de vista para crear IBOutlet como se muestra en el siguiente código

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

luego ponga el siguiente código a la vista si se cargó o dentro de cualquier acción

self.select_dateHeight.constant = 0 // we can change the height value

si está dentro de un botón, haga clic

@IBAction func Feedback_button(_ sender: Any) {
 self.select_dateHeight.constant = 0

}
Nimisha joshy
fuente
1

Para actualizar una restricción de diseño, solo necesita actualizar la propiedad constante y llamar a layoutIfNeeded después.

myConstraint.constant = newValue
myView.layoutIfNeeded()
Fran Martin
fuente
1
Create an IBOutlet of NSLayoutConstraint of yourView and update the constant value accordingly the condition specifies.

//Connect them from Interface 
@IBOutlet viewHeight: NSLayoutConstraint! 
@IBOutlet view: UIView!

private func updateViewHeight(height:Int){
   guard let aView = view, aViewHeight = viewHeight else{
      return
   }
   aViewHeight.constant = height
   aView.layoutIfNeeded()
}
CrazyPro007
fuente