Dans mon application iPhone OS, je veux (besoin) de surveiller les changements d'orientation de l'appareil afin de réorganiser certaines parties de l'écran. L'approche que j'ai utilisée consistait à utiliser CGRect frame = [UIScreen mainScreen].applicationFrame
Pour obtenir la taille de l'écran et à partir de là, calculer la taille et/ou le positionnement d'autres contrôles (j'ai également essayé self.view.frame
).
Tous les tests ont été effectués jusqu'à présent en mode Portrait, donc je pouvais me concentrer sur la programmation des principales fonctionnalités et plus tard, juste faire quelques ajustements pour Paysage. Et voici le problème: dans -(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
j'ai ajouté un peu de journalisation pour vérifier les tailles avant de continuer, mais apparemment les valeurs pour la largeur et la hauteur sont "incorrectes" (je dis "incorrectes" car à première vue les valeurs n'a pas de sens pour moi).
Voici la sortie de certains journaux:
Les valeurs de "w" et "h" dans Paysage me semblent inversées - je m'attendais à ce que w = 480 et h = 300.
Qu'est-ce que je fais mal? Le code que j'ai utilisé pour déboguer est ci-dessous.
-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
CGRect frame = [UIScreen mainScreen].applicationFrame;
CGSize size = frame.size;
NSLog(@"%@", [NSString stringWithFormat:@"Rotation: %s [w=%f, h=%f]",
UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? "Portrait" : "Landscape",
size.width, size.height]);
}
L'orientation de votre appareil a changé, pas les caractéristiques physiques de l'écran. Vous l'avez essentiellement incliné sur le côté, mais en réalité il fait 320 pixels de large (dont 20 ne sont pas disponibles pour le moment car la barre d'état s'affiche) et 480 pixels de haut. Si votre vue tourne automatiquement, la largeur/hauteur a été traduite pour vous, mais lorsque vous demandez les dimensions réelles de l'écran, vous récupérez les dimensions réelles de l'écran.
C'est aussi pourquoi, lorsque vous travaillez avec des vues traduites, il est important de faire des calculs basés sur le centre de la vue et les limites de la vue et jamais sur le cadre de la vue.
Utilisation self.view.bounds
au lieu.
Je suis tombé sur le même problème et avec certains travaux de diagnostic, j'ai découvert que les limites et le cadre de la vue ne reflètent pas précisément l'orientation paysage dans viewDidLoad
(lorsque l'appareil est maintenu en paysage lorsque le contrôleur de vue est poussé sur la pile), mais faites-le correctement dans viewWillAppear:
et viewDidAppear:
. Je viens de déplacer mon code qui avait besoin des dimensions du cadre/des limites de viewDidLoad
à viewWillAppear:
, et cela a fonctionné correctement.