292 votes

Quand a-t-il lieu ?

J'ai une vue personnalisée qui n'est pas layoutSubview messages lors de l'animation.

J'ai une vue qui remplit l'écran. Il a une coutume sous-vue au bas de l'écran qui redimensionne correctement au bureau de l'IB si je change la hauteur de la barre de navigation. layoutSubviews est appelée lorsque la vue est créée, mais jamais plus. Mon sous-vues sont correctement définies. Si je bascule l'état de l'appel arrêt de la barre, la sous-vue du layoutSubviews n'est pas appelée à tous, même si la vue ne doit animer son redimensionnement.

Dans quelles circonstances est-layoutSubviews appelle en réalité?

J'ai autoresizesSubviews définie sur NON pour mon affichage personnalisé. Et au bureau de l'IB, j'ai le haut et le bas jambes de force et la flèche verticale définie.

531voto

BadPirate Points 11614

J'ai eu une question similaire, mais n'était pas satisfait de la réponse (ou j'ai pu trouver sur le net), donc je l'ai essayé, dans la pratique, et voici ce que j'ai:

  • init ne cause pas de layoutSubviews à être appelé (duh)
  • addSubview causes layoutSubviews d'être appelé sur le vue d'être ajoutée, la vue, il est ajouté à (cible), et tous les les sous-vues de la cible
  • vue setFrame intelligemment les appels layoutSubviews sur la vue de son cadre de jeu seulement si le paramètre de taille de l'image est différentes
  • défilement d'un UIScrollView causes layoutSubviews à être appelé la scrollView, et son superview
  • la rotation d'un appareil uniquement les appels layoutSubview sur la vue parent (le répondre viewControllers primaire afficher)
  • Le redimensionnement d'une vue appel layoutSubviews sur son superview

Mes résultats http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/

115voto

Patrick Points 697

Bâtiment sur la réponse précédente par @BadPirate, j'ai expérimenté un peu plus loin et est venu avec quelques précisions/corrections. J'ai trouvé que l' layoutSubviews: sera appelée sur une vue si et seulement si:

  • Ses propres limites (pas de cadre) a changé.
  • Les limites de l'un de ses directe les sous-vues changé.
  • Une sous-vue est ajouté à la vue ou retiré de la vue.

Quelques détails:

  • Les limites sont considérés comme modifiés que si la nouvelle valeur est différente, y compris une origine différente. Remarque spécifiquement c'est pourquoi, layoutSubviews: est appelé à chaque fois qu'un UIScrollView parchemins, qu'il effectue le défilement par la modification de ses limites d'origine.
  • Modification de l'image ne changera des limites, si la taille a changé, qui est la seule chose propagées vers les limites de la propriété de toute façon.
  • Un changement dans les limites d'un point de vue qui n'est pas encore en vue de la hiérarchie se traduit par un appel à l' layoutSubviews: lorsque la vue est éventuellement ajoutée à la vue de la hiérarchie.
  • Et juste pour être complet: ces déclencheurs ne sont pas directement appel layoutSubviews, mais plutôt appel setNeedsLayout, qui fixe/soulève un drapeau. Chaque itération de l'exécution de la boucle, pour tous les points de vue dans la vue de la hiérarchie, cette case est cochée. Pour chaque vue, où le drapeau est trouvé soulevées, layoutSubviews: est demandé et le drapeau est remis à zéro. Vues plus haut dans la hiérarchie sera vérifié/appelé en premier.

14voto

Mohit Nigam Points 339

Certains points dans BadPirate de réponse ne sont que partiellement vrai:

  1. Pour addSubView point

    addSubview causes layoutSubviews d'être appelé sur le point de vue d'être ajoutée, la vue, il est ajouté à (cible), et tous les sous-vues de la cible.

    Il dépend de la vue (vue cible) autoresize masque. Si il a autoresize masque, layoutSubview sera appelée sur chaque addSubview. Si elle n'a pas de autoresize masque puis layoutSubview sera appelée que lorsque la vue (Vue cible) taille de l'image change.

    Exemple: si vous avez créé UIView par programme (il n'a pas de autoresize masque par défaut), LayoutSubview sera appelée que lorsque UIView cadre des changements non sur chaque addSubview.

    C'est grâce à cette technique que les performances de l'application augmente également.

  2. Pour le dispositif de point de rotation

    La rotation d'un appareil uniquement les appels layoutSubview sur la vue parent (la réponse viewController primaire de vue)

    Ce peut être le cas que lorsque votre cv est dans le VC de la hiérarchie (de la racine à l' window.rootViewController), eh bien c'est le cas le plus courant. Dans iOS 5, si vous créez un VC, mais il n'est pas ajouté à un autre VC, alors ce VC aurait pas remarqué lors d'un appareil de pivoter. Par conséquent, de son point de vue, de ne pas se faire remarquer par l'appel de layoutSubviews.

9voto

Steve Weller Points 1556

J'ai suivi la solution en bas de l'Interface du Constructeur insistance que les ressorts ne peut pas être changé sur un point de vue qui a la simulation, les éléments de l'écran allumé (barre d'état, etc.). Depuis que les sources ont été hors de la vue principale, de ce point de vue ne pouvait pas changer de taille et de là, a été défile vers le bas dans son intégralité lors de l'appel de la barre est apparu.

Tournant la simulation des caractéristiques hors tension, puis le redimensionnement de l'affichage et de réglage des ressorts correctement causés à l'animation de se produire et ma méthode à appeler.

Un autre problème dans le débogage c'est que le simulateur de ferme l'application lorsque l'état de l'appel est activée via le menu. Quittez l'app = pas de débogueur.

9voto

bademi Points 131

appeler `` dans viewController permet d’appeler viewDidLayoutSubviews

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