web-dev-qa-db-fra.com

Comment layoutIfNeeded est-il utilisé?

Quand et comment layoutIfNeeded est-il utilisé? Je sais que lorsque nous modifions la présentation d'une vue, nous pouvons appeler setNeedsLayout pour la mettre à jour, mais sans savoir quand layoutIfNeeded doit être utilisé.

REMARQUE: J'ai utilisé layoutIfNeeded dans le code réel, mais j'ai oublié dans quel contexte il a été utilisé.

45
Boon

layoutIfNeeded oblige le récepteur à mettre en forme ses sous-vues immédiatement si nécessaire.

Supposons que vous ayez surchargé layoutSubviews et que UIKit estime que votre vue nécessite une présentation pour quelque raison que ce soit (vous avez par exemple appelé setNeedsLayout lorsque vous gérez une action de l'utilisateur). Ensuite, votre méthode layoutSubviews personnalisée sera appelée immédiatement au lieu du moment où elle serait normalement appelée dans la séquence d'événements de boucle d'exécution UIKit normale (après la gestion des événements, mais avant le drawRect:).

Voici un exemple de raison pour laquelle vous pourriez avoir besoin d'appeler layoutIfNeeded au sein d'une boucle d'exécution unique:

  1. Vous redimensionnez une vue personnalisée contenant une vue sous forme de tableau avec une présentation personnalisée. setNeedsLayout est défini pour que layoutSubviews soit appelé ultérieurement.
  2. Un objet contrôleur demande à la vue tabulaire de faire défiler vers une cellule particulière lors de la gestion d'un événement utilisateur.
  3. Votre vue personnalisée effectue un dimensionnement personnalisé de la vue tabulaire dans layoutSubviews qui modifie la taille de la vue tabulaire.

Le problème est que lorsque le contrôleur a demandé à la vue table de faire défiler (étape 2), la vue table avait des limites périmées. Les limites mises à jour ne seront définies que plus tard sur la vue tableau (étape 3). Il est possible que le contrôleur ne souhaite pas que la vue tabulaire défile jusqu'à ce que layoutSubviews soit terminé. Une solution serait alors que le contrôleur appelle layoutIfNeeded dans les cas où il sait que cela peut se produire.

61
Allen Ding

LayoutSubViews () - N'appelez pas directement, mais appelez setNeedsLayout (), écrasez si la base de contrainte n'offre pas ce qui est attendu comportement.

SetNeedsLayout () - Appelez sur le thread principal, attend le prochain cycle de dessin . bon pour la performance.

LayoutIfNeeded () - Layout subview immédiatement.

0
Avijit Nagare

La différence entre ces deux méthodes peut maintenant être décrite en référençant le cycle de mise à jour.

La méthode setNeedsLayout pour UIView indique au système que vous souhaitez qu'il structure et redessine cette vue et toutes ses sous-vues, au moment du cycle de mise à jour. Il s’agit d’une activité asynchrone, car la méthode s’achève et est renvoyée immédiatement, mais ce n’est que plus tard que la présentation et le rafraîchissement auront lieu et que vous ne savez pas quand le cycle de mise à jour aura lieu.

En revanche, la méthode layoutIfNeeded est un appel synchrone qui indique au système que vous souhaitez une mise en forme et une mise à jour d'une vue et de ses sous-vues, et que vous souhaitez qu'elle soit effectuée immédiatement, sans attendre le cycle de mise à jour. Lorsque l'appel de cette méthode est terminé, la présentation a déjà été ajustée et dessinée en fonction de toutes les modifications notées avant l'appel de la méthode.

Donc, a déclaré succinctement, layoutIfNeeded dit update immédiatement s'il vous plaît, alors que setNeedsLayout dit s'il vous plaît update, mais vous pouvez attendre jusqu'au prochain cycle de mise à jour.

0
CrazyPro007