web-dev-qa-db-fra.com

taille de trame incorrecte dans viewDidLoad

Duplicata possible:
Pourquoi dois-je définir manuellement le cadre de ma vue dans viewDidLoad?

J'ai une application universelle pour iphone et ipad, deux storyboards, si je lance mon application sur le simulateur d'iphone dans viewDidLoad chaque trame de chaque élément dans nib est correcte. Mais si je le fais pour ipad (simulateur) dans le cadre, c'est nul, mais l'écran semble correct. Pourriez-vous s'il vous plaît me conseiller smth? Merci.

33
Oleg

C'est une question très similaire à ios setContentOffset ne fonctionne pas sur iPad ... Et ma réponse est la même que là-bas:

"Vous ne devez pas initialiser les éléments liés à la géométrie de l'interface utilisateur dans viewDidLoad, car la géométrie de votre vue n'est pas définie à ce stade et les résultats seront imprévisibles.

... viewWillAppear: est le bon endroit pour faire ces choses, à ce stade, la géométrie est définie, donc obtenir et définir des propriétés liées à la géométrie est logique. "

Cela s'applique également aux propriétés liées à la géométrie obtention. Ne vous laissez pas distraire par le fait qu'il se comporte correctement dans une circonstance et pas dans une autre ... Le point principal est que définir/obtenir des propriétés géométriques trop tôt donnera imprévisible résultats.

Votre écran regarde correct parce que vous voyez les résultats aprèsviewWillAppear:/viewDidAppear:.

mise à jour (ios6)

Lors de l'utilisation de la mise en page automatique dans ios6, les cadres ne sont définis que lorsque les sous-vues ont été disposées. Le bon endroit pour obtenir des données de trame dans ces conditions est dans la méthode viewController viewDidLayoutSubviews.

Cela s'appelle aprèsviewWillAppear:. Mais attention, ils ne sont pas toujours réunis. Par exemple, viewDidLayoutSubviews est appelé après une rotation, viewWillAppear: n'est pas. viewWillAppear: est appelé chaque fois qu'une vue devient la vue visible *, viewDidLayoutSubviews pas nécessairement (seulement si les vues doivent être relayées).

(* sauf si l'application était en arrière-plan et devient l'application de premier plan, alors viewWillAppear: n'est pas appelé)

108
foundry

J'ai compris pourquoi c'était arrivé. J'utilisais AutoLayout. Lorsque je la décoche dans le storyboard, les cadres sont corrects.

7
Oleg