web-dev-qa-db-fra.com

Constante NSLayoutConstraint non mise à jour après la définition

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?

18
Ramin Afshar

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];
48
Yogesh Suthar

Ê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!
10
Frédéric Adda

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:

enter image description here

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.

8
CLK

lorsque vous avez terminé vos changements de contrainte, appelez simplement:

[self setNeedsUpdateConstraints];
5
Bogdan Somlea