web-dev-qa-db-fra.com

La barre d'état est Paysage, mais [[UIApplication sharedApplication] statusBarOrientation] renvoie portrait.

Ce problème semble être intermittent, mais je ne sais pas pourquoi exactement. Lorsque j'exécute mon application sur le périphérique (iPad), je dispose d'un code pour charger une vue de défilement avec certaines vues d'image en fonction de l'orientation actuelle du périphérique. Même si l'appareil est en mode paysage avant le chargement, les vues sont chargées comme s'il s'agissait d'un portrait.

L'orientation est trouvée en appelant [[UIApplication sharedApplication] statusBarOrientation].

Les vues sont configurées pour ajuster leurs positions lors de la rotation du périphérique. En effet, une rotation en mode portrait puis en mode paysage les ramène aux positions correctes du paysage. Est-il vrai que toutes les applications démarrent en mode portrait et passent rapidement en mode paysage si nécessaire? Est-ce que j'essaie de vérifier l'orientation trop tôt (pendant la init du premier contrôleur de vue à charger)?

15
Stuart

Si vous sous-classez UIWindow ou la barre d'état, vous verrez ceci car il s'agit de l'orientation native du périphérique ipad. UIWindow traduit l'orientation et les coordonnées en ce à quoi nous sommes habitués. Une fois que vous avez renduAndKeyVisible, l'orientation de votre périphérique et de votre interface dans les contrôleurs de vue doit être celle attendue. Vous ne voudriez pas utiliser MTStatusBarOverlay par hasard? Je suis passé par la même chose et cela est descendu à l'ordre d'instatiation. 

7
Greg Combs

OK corrigé.

À l'aide de UINavigationController, lorsque je clique sur PopToViewController: animé: d'une vue paysage à une vue portrait, la vue de destination semble correcte, mais la barre d'état ainsi que le panneau UIKeyboard conservent la configuration du paysage, créant un véritable désordre.

Contournement Après des milliers de recommandations sur statusBarOrientation et des références, lisez ... https://developer.Apple.com/library/content/releasenotes/General/ RN-iOSSDK-6_0/index.html

"La méthode setStatusBarOrientation: animated: n'est pas obsolète . Elle ne fonctionne désormais que si la méthode supportedInterfaceOrientations Du contrôleur d'affichage plein écran le plus en haut renvoie 0. Ce l'appelant chargé de s'assurer que l'orientation de la barre d'état est cohérente. " (grâce à Vytis ici)

statusBarOrientation ne fonctionne que si supportedInterfaceOrientations renvoie 0, alors ... qui nous laisse deviner. 

Si statusBarOrientation n'est pas comme prévu, un retour à zéro le fera (si toujours, retourne 0, la vue ne tournera pas, donc:

// if deviceOrientation is A (so I expect statusbarOrientation A
// but statusbarOrientation is B
// return 0
// otherwise 
// return user interface orientation for A

- (NSUInteger)supportedInterfaceOrientations {
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    UIInterfaceOrientation statusBarOrientation =[UIApplication sharedApplication].statusBarOrientation;
    if(deviceOrientation == UIDeviceOrientationPortrait || deviceOrientation == UIDeviceOrientationPortraitUpsideDown){
        if(statusBarOrientation != UIInterfaceOrientationPortrait ||statusBarOrientation != UIInterfaceOrientationPortraitUpsideDown){
             return 0;
        }
    }
    // otherwise
    return UIInterfaceOrientationMaskPortrait;
}

Maintenant, dans viewDidAppear (croyez-moi, j'utilise cet appel même lorsque la notification au clavier est reçue:

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;

plus de 48 heures de travail dans ce domaine. J'espère que cela vous aidera un peu, merci à tous.

35
SyntheticMeshwork

Juste au cas où quelqu'un d'autre se heurterait à cela, je vois beaucoup d'applications qui ont des problèmes similaires dans iOS5, en fait sur iPhone.

Cela pourrait être un bug dans iOS 5 ou simplement une interférence avec un comportement commun ...

J'utilise une classe de contrôleur de vue racine personnalisée (une sous-classe UITabBarController, aucune idée de l'importance de cela) et dans cette classe, j'ai remplacé "shouldAutorotateToInterfaceOrientation" pour ne commencer à pivoter qu'après la configuration initiale de l'écran (ce qui aurait gâché certaines choses).

Ce que je fais maintenant, c’est que je réutilise cette classe pour définir également le statusBarOrientation manuellement en mode portrait avant d’autoriser les rotations et en fonction de la rotation ultérieure de l’interface utilisateur.

[[UIApplication sharedApplication] setStatusBarOrientation:toInterfaceOrientation animated:YES];

Je crois que cela pourrait résoudre CE problème, aussi, même si la cause pourrait ne pas être liée.

4
coolio

Si vous rencontrez ce problème au moment du lancement, vous devez utiliser UIDevice pour obtenir l'orientation du périphérique, car statusBarOrientation restera toujours en mode portrait uniquement après l'application: didFinishLaunchingWithOptions :. Le seul inconvénient est que vous devez activer les notifications d'orientation de périphérique avant de demander l'orientation à UIDevice.

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
1
Mark Krenek

Vous êtes-vous assuré d'avoir tout cela dans info.plist?

<key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
0
honcheng