iOS Autolayout – La taille de l'image n'est pas définie dans viewDidLayoutSubviews

Je travaille sur un keyboard pour iOS 8 en utilisant Autolayout pour placer les buttons sur la vue.
Lorsque je change la layout en utilisant des contraintes, tout apparaît correctement à l'écran, mais quand je veux connaître la taille de l'image, je n'ai pas la bonne taille.

Par exemple: j'appuie sur une touche, la disposition du keyboard change et maquille tout selon mes contraintes. Ensuite, je veux connaître la taille de n'importe quel button sur l'écran – je le fais dans "viewDidLayoutSubviews" et get ce résultat dans la console:

2014-10-29 12:27:09.088 Keyboard[2193:60674] view did layout subviews 2014-10-29 12:27:09.088 Keyboard[2193:60674] {{inf, inf}, {0, 0}} 

Le button a la bonne taille et la bonne position, mais lorsque vous essayez d'get son image, la taille n'est pas définie.

Où dois-je mettre mon code quand il ne fonctionne pas dans viewDidLayoutSubviews?

J'ai trouvé beaucoup de questions sur stackoverflow et d'autres websited, mais aucun d'entre eux n'a couvert ma question.

J'ai rencontré un problème très similaire (question upvoted) et trouvé la réponse de beeef à point dans la bonne direction. Étant donné que la documentation d'Apple dit de ne pas appeler layoutSubviews () directement, j'ai plutôt fait comme suit (où mySubView est une sous-vue directe de self.view):

 override func viewDidLayoutSubviews() { // self.view's direct subviews are laid out. // force my subview to layout its subviews: self.mySubView.setNeedsLayout() self.mySubView.layoutIfNeeded() // here we can get the frame of subviews of mySubView // and do useful things with that... } 

Juste pour info, dans mon cas mySubView est un UIScrollView, et j'ai besoin d'get le cadre d'une de ses sous-vues, de sorte que je puisse définir le contentOffset en conséquence avant que la vue apparaisse. Je ne suis pas sûr que viewDidLayoutSubviews () soit le meilleur endroit pour le faire, mais cela garantit que mySubView a été mis en page.

Oui! J'ai résolu ce problème moi-même.

Je ne suis pas sûr d'avoir bien compris, mais c'est ce que je pense:

  • viewDidLayoutSubviews est appelé à chaque fois que la layout change
  • viewDidLayoutSubviews est appelé lorsque les sous-vues directes de ma vue ont fait la layout, mais les sous-vues de ces sous-vues n'ont pas été mises en page à ce moment-là, donc vous ne pouvez pas get leur taille.

Ma solution maintenant était d'appeler manuellement .layoutSubviews () sur toutes mes vues qui contient tous mes buttons de mon keyboard. Après cela, j'obtiens la taille de tous les buttons que je veux.

Corrigez-moi si j'ai tort, s'il-vous plait.