web-dev-qa-db-fra.com

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

J'ai un UIView et je définit les contraintes à l'aide de Xcode Interface Builder.

Maintenant, je dois mettre à jour cette constante UIView's hauteur par programme.

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

74
Chris Mikkelsen

Sélectionnez la contrainte de hauteur dans le générateur Interface et prenez-la en 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. Cela est utile lorsque vous définissez les contraintes par programme. Il met à jour les contraintes pour la vue. Pour plus de détails, cliquez ici .

164
Parth Adroja

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

Dans le générateur d'interface, indiquez à chaque contrainte que vous souhaitez modifier un identifiant:

enter image description here

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 le même identifiant à plusieurs contraintes, vous permettant ainsi de les regrouper et de les modifier en même temps.

85
George Filippakos

Change HeightConstraint et WidthConstraint Sans 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 en utilisant cette extension.

Vous pouvez utiliser cette extension pour extraire une contrainte de hauteur et de largeur

extension UIView {

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

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

}

Vous pouvez utilise

yourView.heightConstaint?.constant = newValue 
20
AshvinGudaliya

Faites glisser la contrainte dans votre VC en tant qu'IBOutlet. Ensuite, vous pouvez modifier la 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 {
        myConstraint.constant = 10
        myView.layoutIfNeeded()
    }
}
10
dylanthelion

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

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

Commencez par connecter la contrainte de hauteur à notre contrôleur de vue pour créer IBOutlet comme ci-dessous.

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

puis mettre le code ci-dessous en vue ne se charge 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 clic de bouton

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

}
4
Nimisha joshy

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 () à ce moment-là.

3
Nupur Sharma

Pour mettre à jour une contrainte de présentation, il vous suffit de mettre à jour la propriété constant et d'appeler layoutIfNeeded après.

myConstraint.constant = newValue
myView.layoutIfNeeded()
1
Fran Martin
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()
}
1
CrazyPro007