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.
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
}
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:
Pour mettre à jour la valeur de contrainte:
self.heightConstraint.constant = 300;
[self.view updateConstraints];
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)
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.
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: