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é.
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:
setNeedsLayout
est défini pour que layoutSubviews
soit appelé ultérieurement.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.
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.
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.