Comment mettre à jour la contrainte de hauteur constante d'un UIView par programmation?


102

J'ai un UIViewet j'ai défini les contraintes à l'aide de Xcode Interface Builder.

Maintenant, je dois mettre à jour cette UIView'sconstante de hauteur par programme.

Il y a une fonction qui va comme myUIView.updateConstraints(), mais je ne sais pas comment l'utiliser.


Retirez la contrainte de hauteur et réglez-la par programme
iMuzahid

vous pouvez utiliser ce lien ou ce lien pour des références.
Amna Farhan

Voici un moyen de mettre à jour une ou plusieurs contraintes. stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran

Réponses:


218

Sélectionnez la contrainte de hauteur dans le générateur d'interface et prenez-en une sortie. Ainsi, lorsque vous souhaitez modifier la hauteur de la vue, vous pouvez utiliser le code ci-dessous.

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

La méthode updateConstraints()est une méthode d'instance de UIView. Il est utile lorsque vous définissez les contraintes par programme. Il met à jour les contraintes de la vue. Pour plus de détails, cliquez ici .


58
Aujourd'hui, j'ai appris que les contraintes peuvent être transformées en exutoire, et à partir de là, je peux faire tout ce que je veux en faire. Merci
Chris Mikkelsen

@ParthAdroja, bro pouvez-vous s'il vous plaît jeter un oeil à ma question stackoverflow.com/questions/46034278/… ?
Mai Phyu

Je n'ai pas de fichier xib, et comment définir yourHeightConstraint dans un UIView par programmation?
newszer

@newszer, vous devez chercher un autre sujet pour ce stackoverflow.com/questions/31651022/…
Parth Adroja

J'ai entendu dire que nous devrions appeler layoutIfNeeded après la contrainte constante de changement. Pourquoi? et parfois j'appelle layoutIfNeeded à l'intérieur de viewWillLayoutSubviews et viewDidLayoutSubviews. ça va?
mnemonic23

104

Si vous avez une vue avec plusieurs contraintes, un moyen beaucoup plus simple sans avoir à créer plusieurs points de vente serait:

Dans le constructeur d'interface, donnez à chaque contrainte que vous souhaitez modifier un identifiant:

entrez la description de l'image ici

Ensuite, dans le code, vous pouvez modifier plusieurs contraintes comme ceci:

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

Vous pouvez donner à plusieurs contraintes le même identifiant, vous permettant ainsi de regrouper les contraintes et de les modifier toutes en même temps.


Cela fonctionne bien mais je trouve qu'il est plus facile de n'utiliser qu'une collection de points de vente ordinaire pour regrouper les contraintes. Par exemple, sur la vue avec laquelle je travaille, il y a 47 contraintes mais seulement 6 que je veux changer à l'exécution, donc c'est une boucle beaucoup plus petite. Cela ne nécessite pas non plus de synchroniser les chaînes entre deux endroits différents.
Gary Z

1
Merci George pour cette astuce. C'est une réelle aide avec certaines mises en page actuelles avec lesquelles je joue.
Jim Hillhouse

1
BEAU
William Yang

Salut, je l'utilise de la même manière, mais cela ne va jamais dans le cas si et j'ai donné le même identifiant.
Rob13

Je me demandais s'il était possible de nommer contrainte. Très bonne réponse!
ShadeToD

35

Changer HeightConstraintet WidthConstraintsans créer IBOutlet.

Remarque: attribuez une contrainte de hauteur ou de largeur dans le fichier Storyboard ou XIB. après avoir récupéré cette contrainte à l'aide de cette extension.

Vous pouvez utiliser cette extension pour récupérer une contrainte de hauteur et de largeur:

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() }
}

}

Vous pouvez utiliser:

yourView.heightConstraint?.constant = newValue 

2
Il existe une méthode que first(where: ...)vous pouvez utiliser immédiatement au lieu de filter+first
Vyachaslav Gerchicov

13

Faites glisser la contrainte dans votre VC en tant qu'IBOutlet. Ensuite, vous pouvez modifier sa valeur associée (et d'autres propriétés; consultez la documentation):

@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()
    }
}

9

Vous pouvez mettre à jour votre contrainte avec une animation fluide si vous le souhaitez, voir le morceau de code ci-dessous:

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})

4

Si la méthode ci-dessus ne fonctionne pas, assurez-vous de la mettre à jour dans le bloc Dispatch.main.async {}. Vous n'avez pas besoin d'appeler la méthode layoutIfNeeded () alors.


4

Connectez d'abord la contrainte de hauteur à notre viewcontroller pour créer IBOutlet comme le code ci-dessous

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

puis mettez le code ci-dessous en vue a chargé ou à l'intérieur des actions

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

si c'est à l'intérieur d'un bouton cliquez

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

}

1

Pour mettre à jour une contrainte de mise en page, il vous suffit de mettre à jour la propriété constante et d'appeler layoutIfNeeded après.

myConstraint.constant = newValue
myView.layoutIfNeeded()

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()
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.