web-dev-qa-db-fra.com

iOS NSLayoutConstraint Fixed Width à l'aide de constraintWithItem

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.

41
Connor

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))
119
Connor

Que diriez-vous d'utiliser Ancres de mise en page ?

myView.widthAnchor.constraintEqualToConstant(29).isActive = true
15
Lukas Batteau

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
10
Eduardo Irias

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.

5
Tejvansh

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
0
Ashley Mills