238 votes

setNeedsLayout vs updateConstraintsIfNeeded vs setNeedsUpdateConstraints et layoutIfNeeded

Je sais que la mise en page automatique de la chaîne se compose essentiellement de 3 différents processus.

  1. la mise à jour des contraintes
  2. les vues de disposition (ici est l'endroit où nous obtenons le calcul d'images)
  3. 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?

271voto

coverback Points 1526

Vos conclusions sont à droite. Le schéma de base est:

  • setNeedsUpdateConstraints permet de s'assurer un futur appel d' updateConstraintsIfNeeded des appels updateConstraints.
  • setNeedsLayout permet de s'assurer un futur appel d' layoutIfNeeded des appels layoutSubviews.

Lors de l' layoutSubviews est appelée, elle appelle aussi updateConstraintsIfNeeded, afin de l'appelant manuellement, il est rarement nécessaire dans mon expérience. En fait, je n'ai jamais appelé, sauf lorsque le débogage des mises en page automatiques.

La mise à jour de contraintes à l'aide de setNeedsUpdateConstraints est assez rare aussi, objc.io–un doit lire sur les mises en page automatiques–dit:

Si quelque chose change plus tard qui invalide l'un de vos contraintes, vous devez supprimer la contrainte immédiatement et appelez setNeedsUpdateConstraints. En fait, c'est le seul cas où vous devriez avoir à déclencher une contrainte de mise à jour de passage.

En outre, dans mon expérience, je n'ai jamais eu d'invalider les contraintes, et de ne pas définir l' setNeedsLayout dans la prochaine ligne de code, en raison de nouvelles contraintes assez beaucoup de sont demandant une nouvelle mise en page.

Les règles de base sont:

  • Si vous avez manipulé des contraintes directement, appelez - setNeedsLayout.
  • Si vous avez modifié certaines conditions (telles que des décalages ou qch) qui permettrait de modifier les contraintes de votre substituée updateConstraints méthode (a recommandé de modifier les contraintes, btw), appelez - setNeedsUpdateConstraints, et la plupart du temps, setNeedsLayout après.
  • Si vous avez besoin de l'un quelconque des actes ci-dessus pour effet immédiat-par exemple, quand votre besoin d'apprendre la nouvelle hauteur du cadre après une passe de mise en page-ajouter un layoutIfNeeded.

Aussi, dans votre code d'animation, je crois, setNeedsUpdateConstraints est inutile, les contraintes sont mis à jour avant de l'animation à la main, et uniquement l'animation de re-mises en page de l'affichage en fonction de diff entre les anciens et les nouveaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X