38 votes

Taille "incorrecte" du cadre / de la fenêtre après réorientation dans l'iPhone

Dans mon iPhone OS application que j'ai envie (besoin) pour surveiller les changements dans l'orientation du périphérique afin de réorganiser certaines parties de l'écran. L'approche que j'ai utilisée était d'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 aussi essayé d' self.view.frame).

Tous les tests ont été fait jusqu'à présent en mode Portrait, de sorte que je puisse me concentrer sur la programmation, les principales caractéristiques et, plus tard, il suffit de faire quelques ajustements pour le Paysage. Et ici, entre le problème: En -(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation j'ai ajouté un peu de journalisation pour vérifier la taille avant de procéder, mais apparemment, les valeurs pour la Largeur et la Hauteur sont du "mauvais" (je dis "mauvais" car, au premier coup d'œil les valeurs ne fait pas de sens pour moi).

Voici la sortie de l'abattage:

  • Rotation: Paysage [w=300.000000, h=480.000000]
  • Rotation: Portrait [w=320.000000, h=460.000000]

Les valeurs de "w" et "h" dans le Paysage semblent inversées pour moi - je m'attendais à ce que w=480 et h=300.

Ce que je fais mal? Le code que j'ai utilisé pour le débogage 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]);
}

33voto

Jason Coco Points 52303

L'orientation de votre appareil a changé, pas les caractéristiques physiques de l'écran. En gros, vous avez basculé sur le côté, mais en réalité, c'est de 320 pixels de large (20 qui ne sont pas disponibles au moment depuis la barre d'état montre) et de 480 pixels de haut. Si votre vue est en auto-rotation, puis la largeur/hauteur ont été traduits pour vous, mais lorsque vous demandez pour les dimensions réelles de l'écran, vous recevez en retour les dimensions réelles de l'écran.

C'est aussi pourquoi, lorsqu'on traduit points de vue, il est important de faire des calculs basés sur la vue du centre et de la vue des limites et jamais sur le point de vue de l'image.

27voto

Mike Keskinov Points 2890

Utilisez self.view.bounds place.

18voto

Rob Points 171

J'ai été achoppement sur le même problème et avec quelques travaux de diagnostic, j'ai découvert que le point de vue de limites et le cadre ne reflètent pas exactement l'orientation paysage en viewDidLoad (lorsque l'appareil est tenu en mode paysage lorsque le contrôleur est poussé sur la pile), mais le faire correctement en viewWillAppear: et viewDidAppear:. Je viens de déménager mon code nécessaire les dimensions de l'image/limites d' viewDidLoad de viewWillAppear:, et cela a fonctionné correctement.

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