web-dev-qa-db-fra.com

Mettre à jour la contrainte de hauteur par programmation

Je suis nouveau dans la mise en page automatique. J'ai fait tout mon projet à partir d'un fichier xib, mais maintenant, je rencontrais un problème où je devais mettre à jour la hauteur d'une vue par programme. J'ai essayé ci-dessous mais travaille maintenant.

[[self view] addConstraint:[NSLayoutConstraint constraintWithItem:loginContainer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:loginFrame.size.height]];

En console c'est des spectacles

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x78724530 V:[UIView:0x790cdfb0(170)]>",
    "<NSLayoutConstraint:0x787da210 V:[UIView:0x790cdfb0(400)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x78724530 V:[UIView:0x790cdfb0(170)]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
50
Tapas Pal

Au lieu d’ajouter une nouvelle contrainte, vous devez modifier la constante de votre contrainte existante.

Utilisez un IBOutlet pour vous connecter à votre contrainte dans Interface Builder:

@property (nonatomic, weak) NSLayoutConstraint *heightConstraint;

Ensuite, lorsque vous devez le définir par programme, définissez simplement la propriété constante sur la contrainte:

heightConstraint.constant = 100;

OR

Si vous ne pouvez pas accéder au nib dans Interface Builder, recherchez la contrainte dans le code:

NSLayoutConstraint *heightConstraint;
for (NSLayoutConstraint *constraint in myView.constraints) {
    if (constraint.firstAttribute == NSLayoutAttributeHeight) {
        heightConstraint = constraint;
        break;
    }
}
heightConstraint.constant = 100;

Et à Swift:

if let constraint = (myView.constraints.filter{$0.firstAttribute == .width}.first) {
            constraint.constant = 100.0
        }
109
Dave Paul

Pour obtenir une référence de vos contraintes de hauteur: Cliquez sur + Ctrl dans la contrainte et faites-le glisser dans votre fichier de classe:

enter image description here

Pour mettre à jour la valeur de contrainte:

self.heightConstraint.constant = 300;
[self.view updateConstraints];
20
Hamza

Un moyen plus flexible en utilisant cette extension Swift:

extension UIView {    

    func updateConstraint(attribute: NSLayoutAttribute, constant: CGFloat) -> Void {
        if let constraint = (self.constraints.filter{$0.firstAttribute == attribute}.first) {
            constraint.constant = constant
            self.layoutIfNeeded()
        }
    }
}

Comment utiliser cette extension de vue pour mettre à jour la valeur constante des contraintes existantes:

// to update height constant
testView.updateConstraint(attribute: NSLayoutAttribute.height, constant: 20.0)


// to update width constant
testView.updateConstraint(attribute: NSLayoutAttribute.width, constant: 20.0)
8
Krunal

Appelons votre vue nibView. Donc, vous essayez de charger cette vue dans un contrôleur de vue, vous devez donc d'abord le charger comme vous le faites avec:

[[NSBundle mainBundle] loadNibNamed:@"NibView" owner:self options:nil];

Ensuite, vous devez dire à nibView que vous n’en avez pas besoin pour transformer les masques de redimensionnement automatique en contraintes en faisant

nibView.translatesAutoresizingMaskIntoConstraints = NO;

Ensuite, vous pouvez ajouter vos contraintes

    NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:nibView
                                                                                  attribute:NSLayoutAttributeHeight
                                                                                  relatedBy:NSLayoutRelationEqual
                                                                                     toItem:nil
                                                                                  attribute:NSLayoutAttributeNotAnAttribute
                                                                                 multiplier:1.0
                                                                                   constant:yourValue];

Et enfin, ajoutez-le à vos contraintes de vue:

[self.view addConstraint:heightConstraint];

Vous auriez probablement besoin d'ajouter une contrainte de largeur également.

6
fdiaz

Swift 4.2

Utilisation de la disposition et de l'animation automatiques pour augmenter la hauteur du bouton

Je n'utilise pas de story board. toutes choses dans le code.

import UIKit

class AnimateHeightConstraintViewController: UIViewController {
    var flowHeightConstraint: NSLayoutConstraint?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        view.addSubview(button)
        button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        button.widthAnchor.constraint(equalToConstant: 100).isActive = true
        flowHeightConstraint = button.heightAnchor.constraint(equalToConstant: 30)
        flowHeightConstraint?.isActive = true
    }

    @objc func animateButtonTapped() {
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut, animations: {
            self.flowHeightConstraint?.constant = 100
            self.view.layoutIfNeeded()
        }, completion: nil)
    }

    lazy var button: UIButton = {
       let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.backgroundColor = .green
        button.addTarget(self, action: #selector(animateButtonTapped), for: .touchUpInside)
        return button
    }()
}

et le résultat est comme ça:

enter image description here

1
moraei