J'aimerais définir une contrainte pour donner à un UIButton une largeur fixe (constante) par programmation. Je sais que je peux le faire avec contraintesWithVisualFormat, mais j'utilise constraintWithItem pour toutes mes contraintes en code. Par curiosité/cohérence, je me demandais s’il était possible de le faire avec constraintWithItem.
Trouvé ma solution. Il suffit de définir l'autre objet sur nil et l'autre attribut sur NSLayoutAttributeNotAnAttribute (c'est ce à quoi je n'ai pas pensé) et d'utiliser le paramètre constant pour la largeur fixe:
[self addConstraint:[NSLayoutConstraint constraintWithItem:myButton
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:200]];
Edit: comme cette réponse semble toujours recevoir un nombre équitable de points de vue, je pensais ajouter la syntaxe Swift:
self.addConstraint(NSLayoutConstraint(
item: myButton,
attribute: .width,
relatedBy: .equal,
toItem: nil,
attribute: .notAnAttribute,
multiplier: 1.0,
constant: 200))
Que diriez-vous d'utiliser Ancres de mise en page ?
myView.widthAnchor.constraintEqualToConstant(29).isActive = true
En rapide:
let width = 120
let constraint = NSLayoutConstraint(
item: myView,
attribute: .width,
relatedBy: .equal,
toItem: nil,
attribute: .notAnAttribute,
multiplier: 1.0,
constant: width)
NSLayoutConstraint.activateConstraints([constraint])
Ensuite, vous pouvez changer la valeur constante de la contrainte
constraint.constant = width * 2
Voici un code simple pour le bouton avec une largeur fixe.
format visuel: -
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H: [myButton(==50)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(myButton)]];
Utilisez ce code pour les contraintes utilisant le format visuel où self.view est la vue d'ensemble de votre bouton et myButton est le nom de votre bouton et 50 est la largeur de myButton. Vous pouvez modifier ces valeurs en fonction de la contrainte souhaitée.
format de constraintWithItem: -
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:myButton attribute: NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute: NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:50.0]];
Utilisez ce code pour les contraintes utilisant le format constraintWithItem où self.view est la vue d'ensemble de votre bouton et myButton est le nom de votre bouton et 50 est la largeur de myButton. Vous pouvez modifier ces valeurs en fonction de la contrainte souhaitée.
Plutôt que de chercher une hauteur explicite (28), une meilleure idée serait de chercher une contrainte height
…
loginButton.constraints.first(where: { $0.firstAttribute == .height })?.constant = 40