2010-07-25 18 views
4

Je cours une fonction simple qui est appelée dans plusieurs domaines pour aider à faire face à la mise en page sur une application iPad pendant les changements d'orientation. Il ressemble à ceci:UIOrientation renvoie 0 ou 5

- (void) getWidthAndHeightForOrientation:(UIInterfaceOrientation)orientation { 
    NSLog(@"New Orientation: %d",orientation); 
end 

Et je l'appelle dans divers endroits comme celui-ci:

[self getWidthAndHeightForOrientation: [[UIDevice currentDevice] orientation]]; 

La fonction a normalement un code simple qui fonctionne si l'orientation est portrait ou paysage. Malheureusement, il ne fonctionnait pas comme prévu lorsque l'application est démarrée dans ce qui serait la position 1. Je reçois 0 en conséquence. Plus tard si la fonction est appelée de la même manière mais que l'appareil n'a jamais été pivoté, je récupère une valeur de 5. Qu'est-ce que cela signifie? Pourquoi lancerait-il ces valeurs?

En bref, pourquoi [[UIDevice currentDevice] orientation] aurait-il jamais lancé 0 ou 5 au lieu de n'importe quelle valeur entre 1 et 4?

MISE À JOUR:

Parce que je continuais à trouver des bugs dans mon code en raison de l'orientation de façon a été traitée, je jouté un message définitif sur la façon de gérer les orientations UIDevice ou UIInterface: http://www.donttrustthisguy.com/orientating-yourself-in-ios

Répondre

3

Je recommanderais d'utiliser UIDeviceOrientationIsValidInterfaceOrientation(orientation)

Il vous dira si son orientation en cours de validité (valable étant paysage ou portrait, non FaceUp/FaceDown/UnKnown). Ensuite, vous pouvez le traiter comme si son portrait était inconnu.

Voici comment je le fais:

if (UIDeviceOrientationIsValidInterfaceOrientation(interfaceOrientation) && UIInterfaceOrientationIsLandscape(interfaceOrientation)) { 
    // handle landscape 
} else { 
    // handle portrait 
} 
+0

Merci Bob! Je dois essayer. –

+0

Heureux que ça a marché pour vous! –

8

Avez-vous pris un regard sur les valeurs enum pour UIInterfaceOrientation? D'après les documents:

typedef enum { 
    UIDeviceOrientationUnknown, 
    UIDeviceOrientationPortrait, 
    UIDeviceOrientationPortraitUpsideDown, 
    UIDeviceOrientationLandscapeLeft, 
    UIDeviceOrientationLandscapeRight, 
    UIDeviceOrientationFaceUp, 
    UIDeviceOrientationFaceDown 
} UIDeviceOrientation; 

Ainsi, on pourrait concevoir que ce soit quelque chose de 0-6.

Edit: Peut-être que vous devriez utiliser les méthodes de votre UIViewController (willRotateToInterfaceOrientation:duration:, etc.) au lieu d'appeler orientation sur le ?

+0

Une fois que je change l'orientation en faisant tourner le dispositif, il est toujours bon. Mais je ne comprends pas pourquoi ce serait Inconnu ou retournerais FaceUp. Y a-t-il une fonction que j'ai besoin d'appeler pour qu'elle trouve l'orientation si elle est actuellement inconnue? –

+0

Je suppose que FaceUp est renvoyé lorsque l'appareil est parallèle au sol et qu'il n'a pas encore été pivoté. (J'ai édité ma réponse un peu parce qu'apparemment je ne peux pas compter.) – Wevah

+0

J'ai édité ma réponse encore après avoir regardé quelques affaires. (J'avoue que je fais surtout des trucs de bureau.) – Wevah

0

[UIDevice currentDevice].orientation retourne un UIDeviceOrientation:

La valeur de la propriété est une constante qui indique l'orientation actuelle du dispositif. Cette valeur représente l'orientation physique de l'appareil et peut être différente de l'orientation actuelle de l'interface utilisateur de votre application.

Votre fonction getWidthAndHeightForOrientation prend un paramètre UIInterfaceOrientation:

L'orientation de l'interface utilisateur de l'application.

Ces types, bien que liés, ne sont pas la même chose. Vous pouvez accéder à l'orientation d'interface actuelle à partir de n'importe quel contrôleur de vue à l'aide de self.interfaceOrientation.UIInterfaceOrientation a 4 valeurs possibles tout en UIDeviceOrientation a 9:

typedef NS_ENUM(NSInteger, UIDeviceOrientation) { 
    UIDeviceOrientationUnknown, 
    UIDeviceOrientationPortrait,   // Device oriented vertically, home button on the bottom 
    UIDeviceOrientationPortraitUpsideDown, // Device oriented vertically, home button on the top 
    UIDeviceOrientationLandscapeLeft,  // Device oriented horizontally, home button on the right 
    UIDeviceOrientationLandscapeRight,  // Device oriented horizontally, home button on the left 
    UIDeviceOrientationFaceUp,    // Device oriented flat, face up 
    UIDeviceOrientationFaceDown    // Device oriented flat, face down 
}; 

// Note that UIInterfaceOrientationLandscapeLeft is equal to UIDeviceOrientationLandscapeRight (and vice versa). 
// This is because rotating the device to the left requires rotating the content to the right. 
typedef NS_ENUM(NSInteger, UIInterfaceOrientation) { 
    UIInterfaceOrientationPortrait   = UIDeviceOrientationPortrait, 
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, 
    UIInterfaceOrientationLandscapeLeft  = UIDeviceOrientationLandscapeRight, 
    UIInterfaceOrientationLandscapeRight  = UIDeviceOrientationLandscapeLeft 
};