UI iOS4.3(+), iPhone 6(+) et statusBar

Hello la troupe,


 


J'ai quelques questions encore relatives aux UI sur les différentes versions d'iOS. A savoir que mon projet est rétro compatible jusqu'a la 4.3, je suis obligé d'utiliser des .xib.


 


J'ai fais quelques constatations:


- Sur iOS 7+, lorsque l'on met le device en mode landscape la statusBar disparait. Sur les versions antérieurs elle reste.


- Lorsque je fais un setTransform d'une UIView sur une version antérieurs à  la 8, il est alors impossible de savoir si la statusBar sera la après Rotation.


 


Donc impossible de créer une super vue dynamiquement (ça n'est pas un viewcontroller) qui soit adaptée à  tous les OS.


 


Ma question est: Comment savoir si la statusBar sera la après la rotation?


 


P.S: [[UIApplication sharedApplication] statusBarFrame] et autres méthode du genre me donne la valeure actuelle, pas celle une fois la rotation effectuée.


Réponses



  • P.S: [[UIApplication sharedApplication] statusBarFrame] et autres méthode du genre me donne la valeure actuelle, pas celle une fois la rotation effectuée.




     


    Même dans ce genre de méthode ? :



    - (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
  • Bah enfaite, moi pour detecter le changement d'orientation je faisais comme ça:



    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOrientationChanged:) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
  • AliGatorAliGator Membre, Modérateur
    Bah si tu exécutes ce code à  la notification du WillChange, c'est normal que ça te retourne le statut avant le changement, puisqu'il n'a pas encore commencé ;) Alors que dans le DidChange elle aura déjà  été effectuée.

    Bon sinon maintenant y'a les UIViewControllerTransitionCoordonator qui te permettent de faire des animations pendant les rotations, coordonner ces animations avec une anim de rotation ou quoi, etc... Je sais pas si ça pourrait répondre à  ton besoin, mais c'est bon de savoir que ça existe et ça peut valoir le coup de se renseigner dessus (perso j'ai pas encore regardé)
  • Oui vous avez raison, sur le will/did...

    Je vais faire des tests mais j'ai peur que ça fasse moche si c'est fait après.


    Au pire je peux toujours retouché ma view une fois que c'est fait  ^_^ 


    Le jour ou mon projet supportera au minimum iOS7 j'utiliserais les UIViewControllerTransitionCoordonator...


    Pour l'instant, j'suis à  l'ancienne <_<  


  • Bon alors j'ai vérifié et je ne peux pas.



    Dans la classe UIApplication:



    UIKIT_EXTERN NSString *const UIApplicationWillChangeStatusBarOrientationNotification;
    // userInfo contains NSNumber with new orientation
    UIKIT_EXTERN NSString *const UIApplicationDidChangeStatusBarOrientationNotification;
    // userInfo contains NSNumber with old orientation

    Et moi j'ai besoin de la nouvelle :/


  • NiClouNiClou Membre
    septembre 2014 modifié #7

    Pourquoi cette méthode:



    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willOrientationChange:) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];


    - (void) willOrientationChange:(NSNotification*)notification{
    self.fromOrientation = notification.userInfo[UIApplicationStatusBarOrientationUserInfoKey];
    }

    me retourne: -5764607523034234862 ??


     


    EDIT:


    Bon ça avance... avec un intValue ça marche déja mieux ^^'


    Le problème c'est que j'ai un observeur aussi sur: UIApplicationWillChangeStatusBarFrameNotification et là  par contre je n'ai jamais la bonne. 


  • Pour résumer: J'ai presque réussi.

    Je connais mon orientation de destination et de depart.


    Je connais la frame de ma status bar de depart mais pas d'arrivé malgré l'observeur sur UIApplicationWillChangeStatusBarFrameNotification qui contient toujours 0 !


  • AliGatorAliGator Membre, Modérateur
    Concernant les observeurs la doc est claire et logique :

    - pour la notification "will" le userInfo contient l'orientation de destination. C'est logique, vu que cette notification est appelée AVANT la rotation, dont l'orientation de départ tu l'as déjà , c'est l'orientation actuelle, pas besoin de la remettre dans la notif. Par contre celle d'arrivée elle est dans la notif.

    - pour la notification "did" cest l'inverse, elle est appelée après du coup l'orientation d'arrivée tu l'as déjà  c'est l'orientation qui est maintenant l'orientation courante. Et l'orientation d'origine tu peux pas la deviner donc elle elle est dans le userInfo.


    Pour la valeur farfelue que tu avais c'est normal tu récupérais le pointeur (adresse memoire) de l'objet NSNumber* au lieu de regarder sa intValue. T'aurais eu donc des valeurs de pointeurs différentes a chaque lancement. Mais bon tu as dû certainement avoir un beau warning si tu as essayé d'affecter le pointeur à  une variable de type int normalement.
  • AliGatorAliGator Membre, Modérateur
    septembre 2014 modifié #10
    Quant à  la frame tu peux la récupérer dans le userInfo de UIApplicationWillChangeStatusBarFrameNotification elle y est aussi cf la doc (pas juste le commentaire dans le .h mais la vraie foc complète).
  • NiClouNiClou Membre
    septembre 2014 modifié #11


    Quant à  la frame tu peux la récupérer dans le userInfo de UIApplicationWillChangeStatusBarFrameNotification elle y est aussi cf la doc (pas juste le commentaire dans le .h mais la vraie foc complète).




     


    Oui oui Ali. C'est bien ce que j'ai fait:



    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willSizeChange:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil];

    - (void) willSizeChange:(NSNotification*)notification{
    NSValue* rectValue = [[notification userInfo] valueForKey:UIApplicationStatusBarFrameUserInfoKey];
    CGRect newFrame;
    [rectValue getValue:&newFrame];

    self.statusBarFrame = newFrame;
    }

    Là  mon problème n'est pas présent lors de mon premier affichage. La frame de la statusBar est bonne.


    Le problème arrive quand j'effectue une première rotation en landscape PUIS que je reviens en portrait.


     


    La valeur n'est plus bonne de landscape vers portrait.

     


Connectez-vous ou Inscrivez-vous pour répondre.