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.

Chris Mikkelsen
la source
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 .

Parth Adroja
la source
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.

George Filippakos
la source
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 
AshvinGudaliya
la source
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()
    }
}
dylanthelion
la source
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()
})
Hafiz Muhammad Farooq Rasheed
la source
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.

Nupur Sharma
la source
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

}
Nimisha joshy
la source
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()
Fran Martin
la source
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
la source