Je sais que la mise en page automatique de la chaîne se compose essentiellement de 3 différents processus.
- la mise à jour des contraintes
- les vues de disposition (ici est l'endroit où nous obtenons le calcul d'images)
- affichage
Ce n'est pas tout à fait clair pour moi, c'est l'intérieur de la différence entre -setNeedsLayout
et -setNeedsUpdateConstraints
.
Sur la documentation apple dit:
Appeler cette méthode sur votre application principale de fil quand vous voulez ajuster la mise en page d'une vue de les sous-vues. Cette méthode permet une remarque de la requête et retourne immédiatement. Parce que cette méthode ne permet pas de forcer une mise à jour immédiate, mais au lieu de cela attend la prochaine mise à jour cycle, vous pouvez l'utiliser pour invalider la disposition de plusieurs points de vue avant que l'un de ces points de vue sont mis à jour. Ce comportement vous permet d' consolider l'ensemble de votre mise en page des mises à jour pour un cycle de mise à jour, ce qui est recommandé pour des performances.
Pour la première et,
Lorsqu'une propriété de votre affichage personnalisé des changements d'une manière qui aurait un impact contraintes, vous pouvez appeler cette méthode pour indiquer que les contraintes doivent être mis à jour à un certain moment dans l'avenir. Le système va alors appel updateConstraints dans le cadre de ses activités normales de passe de mise en page. Mise à jour les contraintes à la fois juste avant qu'ils soient nécessaires assure que vous ne pas inutilement recalculer les contraintes lors de multiples changements sont faites de votre point de vue entre la mise en page passe.
pour la deuxième.
Quand je veux animer une vue après la modification d'une contrainte et d'animer les changements que j'ai l'habitude de les appeler 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 -setNeedsLayout
au lieu de -setNeedsUpdateConstraints
tout fonctionne comme prévu, mais si je change -layoutIfNeeded
avec -updateConstraintsIfNeeded
, l'animation ne se produira pas.
J'ai essayé de faire ma propre conclusion:
-
-updateConstraintsIfNeeded
seulement mettre à jour les contraintes mais ne force pas la mise en page à entrer dans le processus, et ainsi de cadres d'origine sont encore conservés -
-setNeedsLayout
des appels aussi-updateContraints
méthode
Alors, quand est ok pour utiliser l'un plutôt que l'autre? et sur les méthodes de présentation, dois-je les appeler sur le point de vue qui change, une contrainte ou sur la vue parent?