Je sais que la chaîne de mise en page automatique consiste essentiellement en 3 processus différents.
- mise à jour des contraintes
- vues de mise en page (c'est ici que nous obtenons le calcul des images)
- afficher
Ce qui n'est pas totalement clair pour moi, c'est la différence intérieure entre -setNeedsLayout
et -setNeedsUpdateConstraints
. Depuis Apple Docs:
Appelez cette méthode sur le thread principal de votre application lorsque vous souhaitez ajuster la disposition des sous-vues d'une vue. Cette méthode prend note de la demande et revient immédiatement. Étant donné que cette méthode ne force pas une mise à jour immédiate, mais attend le cycle de mise à jour suivant, vous pouvez l'utiliser pour invalider la disposition de plusieurs vues avant la mise à jour de l'une de ces vues. Ce comportement vous permet de consolider toutes vos mises à jour de mise en page en un seul cycle de mise à jour, ce qui est généralement meilleur pour les performances.
Lorsqu'une propriété de votre vue personnalisée change d'une manière qui aurait un impact sur les contraintes, vous pouvez appeler cette méthode pour indiquer que les contraintes doivent être mises à jour à un moment donné dans le futur. Le système appellera ensuite updateConstraints dans le cadre de sa passe de mise en page normale. La mise à jour simultanée des contraintes juste avant qu'elles ne soient nécessaires garantit que vous ne recalculez pas inutilement les contraintes lorsque plusieurs modifications sont apportées à votre vue entre les étapes de mise en page.
Lorsque je veux animer une vue après avoir modifié une contrainte et animer les changements que j'appelle habituellement par exemple:
[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.modifConstrView setNeedsUpdateConstraints];
[self.modifConstrView layoutIfNeeded];
} completion:NULL];
J'ai découvert que si j'utilise à la -setNeedsLayout
place de -setNeedsUpdateConstraints
tout fonctionne comme prévu, mais si je change -layoutIfNeeded
avec -updateConstraintsIfNeeded
, l'animation ne se produira pas.
J'ai essayé de tirer ma propre conclusion:
-updateConstraintsIfNeeded
ne met à jour que les contraintes mais ne force pas la mise en page à entrer dans le processus, donc les cadres d'origine sont toujours préservés-setNeedsLayout
appelle également la-updateContraints
méthode
Alors, quand est-il possible d'utiliser l'un au lieu de l'autre? et sur les méthodes de disposition, dois-je les appeler sur la vue qui a changé dans une contrainte ou sur la vue parent?