NSLayoutConstraint constante mise à jour après la mise
J'ai un UIView
la sous-classe correspondante xib
fichier. Dans mon xib j'ai un NSLayoutConstraint
bien qui je suis en train de les animer. J'ai un animateIn
méthode. Le problème est que seul le animateIn méthode fonctionne. Lorsque j'essaie de mettre à jour la constante de nouveau simplement, il reste à la valeur précédente.
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *horizontalConstraint;
Je suis en train de mettre à jour la constante après l'appui sur un bouton. Mais la constante ne semble pas de mise à jour après le réglage. Il enregistre toujours la valeur 0, même après la mise à -500. Je vais appeler 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 mon NSLayoutConstraint est (null) lorsque je veux l'utiliser une deuxième fois. Qui pourrait expliquer pourquoi elle n'est pas mise à jour. Comment devrais-je conserver une référence?
null
puis essayez avec strong
pointeur.OriginalL'auteur Ramin Afshar | 2014-08-11
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de faire appel
setNeedsUpdateConstraints
méthode de correspondantUIView(control)
de qui votre NSLayoutConstraint est présent pour la mise à jour de contrainte.Par exemple de UIButton
Dans votre cas
setNeedsUpdateConstraints
lorsque vous devez les mettre à jour, puis changer leconstant
à l'intérieur de laupdateViewConstraints
méthode qui est appelée automatiquement. Ou, vous pouvez modifier la constante dans la méthode qui nécessite (pour conserver le code lié plus étroitement) et ensuite appelersetNeedsLayout
sur la contrainte de vuesuperview
.Je suis en désaccord avec votre caractérisation ici. Vous remplacer
updateConstraints()
pour faciliter un ensemble complexe de modifications par lot. Mais, à partir de la documentation: > Il est presque toujours plus propre et plus facile à mettre à jour une contrainte immédiatement après l'affectant le changement a eu lieu. ... > Vous ne devriez pas utiliser cette méthode lors de la modification des contraintes en place est trop lent, ou lorsqu'une vue est la production d'un nombre redondant de changements.OriginalL'auteur Yogesh Suthar
Êtes-vous sûr que cette contrainte n'est pas désactivé quelque part?
Définition de l'option "active" de la propriété d'une contrainte à false, le point de vue de la hiérarchie pour supprimer la contrainte. Si vous n'avez pas une référence, la contrainte de l'objet sera supprimé de la mémoire.
J'ai eu le même problème que vous, et supprimé les "faibles" de sorte que la contrainte est aujourd'hui une forte propriété. Par conséquent, il n'est pas mis à zéro lorsque désactivé (parce que mon point de vue, contrôleur a toujours une forte pointeur), et je peux le ré-activer et de re-définir sa constante.
OriginalL'auteur Frédéric Adda
lorsque vous avez terminé votre contrainte changements d'appel:
OriginalL'auteur Bogdan Somlea
J'ai couru dans un problème où la première fois que je la contrainte constante dans le code de la constante serait réglé, mais ensuite, après l'appel de layoutIfNeeded(), comme ceci:
la constante serait revenir à la valeur originale! Je pourrais regarder la variation de la valeur de retour dans le débogueur.
J'ai finalement compris que c'était parce que, dans le storyboard, j'avais mis une variation de la constante. Par exemple:
Dès que j'ai enlevé la variation de la contrainte de la valeur de la constante ne change pas la valeur d'origine avec layoutIfNeeded appel.
OriginalL'auteur CLK
La horizontalConstraint propriété doit être repliée par la vue elle-même. Aussi longtemps que la vue est vivant, le bien doit être non nul (sauf si vous le réglez à néant explicitement quelque part d'autre dans le code). Vérifiez si vous le réglez à néant par erreur.
OriginalL'auteur Nikolay Markov