J'ai une sous-classe UIView
avec un fichier xib
correspondant. Dans mon xib, j'ai une propriété NSLayoutConstraint
que j'essaie d'animer. J'ai une méthode animateIn
. Le problème est que seule la méthode animateIn fonctionne. Lorsque j'essaie de mettre à jour la constante à nouveau, elle reste simplement à la valeur précédente.
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *horizontalConstraint;
J'essaie de mettre à jour la constante après une pression sur un bouton. Mais la constante ne semble pas se mettre à jour après le réglage. Il enregistre toujours 0 même après l'avoir défini sur -500. J'appelle layoutIfNeeded
mais rien ne se passe.
// this works
- (void) animateIn {
[UIView animateWithDuration:1.0 delay:2.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
self.alpha = 1.0;
} completion:^(BOOL finished) {
[UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
self.horizontalConstraint.constant = 0;
[self layoutIfNeeded];
} completion:^(BOOL finished) {
}];
}];
}
// this does not work
- (IBAction)resume:(id)sender {
self.horizontalConstraint.constant = -500;
[self layoutIfNeeded];
NSLog(@"%f",self.horizontalConstraint.constant); // this always stays 0
}
MISE À JOUR
Il semble que ma NSLayoutConstraint soit (null) lorsque je veux l'utiliser une deuxième fois. Cela expliquerait pourquoi il ne se met pas à jour. Comment dois-je garder une référence à lui?
Vous devrez appeler la méthode setNeedsUpdateConstraints
de la fonction UIView(control)
correspondante dont votre NSLayoutConstraint est présente pour mettre à jour la contrainte.
Par exemple de UIButton
self.buttonConstraint.constant = 55;
[self.btnTest setNeedsUpdateConstraints];
Dans ton cas
[self setNeedsUpdateConstraints];
Êtes-vous sûr que cette contrainte n'est pas désactivée quelque part? La définition de la propriété "active" d'une contrainte sur false entraîne la suppression de la contrainte par la hiérarchie de vues. Si vous ne disposez pas également d'une référence à celui-ci, l'objet de contrainte sera supprimé de la mémoire.
J'ai eu le même problème que vous et j'ai supprimé le "faible", donc la contrainte est maintenant une propriété forte. Par conséquent, il n'est pas défini sur zéro lorsqu'il est désactivé (car mon contrôleur de vue a toujours un pointeur puissant), et je peux le réactiver et réinitialiser sa constante.
// NB: don't create these contraints outlets as "weak" if you intend to de-activate them, otherwise they would be set to nil when deactivated!
@IBOutlet private var captionViewHeightConstraint: NSLayoutConstraint!
J'ai rencontré un problème où la première fois que je définissais la constante de contrainte dans le code, la constante serait définie, mais après avoir appelé layoutIfNeeded (), comme ceci:
myConstraint.constant = newValue;
[view layoutIfNeeded]
la constante reviendrait à la valeur d'origine! Je pouvais regarder la valeur changer dans le débogueur.
J'ai finalement compris que c'était parce que, dans le storyboard, j'avais réglé une variation sur la constante. Par exemple:
Dès que j'ai supprimé la variation, la valeur de la constante de contrainte n'a pas changé à la valeur d'origine avec l'appel layoutIfNeeded.
lorsque vous avez terminé vos changements de contrainte, appelez simplement:
[self setNeedsUpdateConstraints];