2010-08-21 15 views
3

J'ai configuré la vue du contrôleur de vue via IB. La vue est définie sur paysage avec la largeur 480 et la hauteur 320. Il est correctement chargé dans le simulateur. Cependant, quand j'ai vérifié self.frame.size en utilisant NSLog, j'ai trouvé que la taille de la frame a changé elle-même sans aucune rotation de périphérique ou de code. Voici ce que je reçois:self.view.frame a changé de taille ifself de manière inattendue en mode paysage

En viewDidLoad -> Taille = 480 x 320

Dans viewWillAppear -> Taille = 480 x 320

Dans viewDidAppear -> Taille = 320 x 480

J'ai seulement des codes dans viewDidLoad, mais pas viewWillAppear ni viewDidAppear. Quelqu'un sait ce qui s'est passé derrière la scène? Merci.

+0

En mode paysage, je connecte les 3 méthodes ci-dessus et tout dit trame 320x480, seulement dans viewDidAppear, la transformation est (0, -1, 1, 0, 0, 0) – onmyway133

Répondre

14

Essayez quelque chose comme ceci:

NSLog("frame=%@ transform=%@", NSStringFromCGRect(self.frame), NSStringFromCGAffineTransform(self.transform)); 

Je suis prêt à parier que transform est l'identité (1,0,0,1,0,0) lorsque la taille du cadre est 480x320 et 90 ° rotation (0,1, -1,0,0,0 ou 0, -1,1,0,0,0) lorsque la taille de l'image est 320x480.

Que se passe-t-il?

Eh bien, viewDidLoad (et I think viewWillAppear) sont appelés avant que la vue ne soit ajoutée à la hiérarchie de vue. Quand il est ajouté à la hiérarchie, UIKit définit également la transformation de vue, qui est la façon dont la rotation se produit.

Mais pourquoi cela change-t-il le cadre?

Eh bien, le "cadre" est relatif à la vue parente, qui est l'UIWindow. La fenêtre ne tourne pas; la vue du contrôleur de vue fait. Du point de vue de la fenêtre, tout est effectivement en mode portrait.

Vous voulez probablement self.view.bounds.

+0

Grande explication! C'est la première fois que cela a vraiment du sens pour moi :) –