les orientations avec "shouldAutorotateToInterfaceOrientation"

motohimemotohime Membre
juillet 2012 modifié dans Apple Developer Programs #1
Bonjour,



Je développe actuellement une application sur Ipad, et elle nécéssite des rotations selon l'orientation du device.



J'ai donc utilisé la méthodes "shouldAutorotateToInterfaceOrientation" dans mes UIViewController, et cela fonctionnait parfaitement tant que j'étais sur IOS 4.3 ( la méthode était appelé à  chaque rotation du device avec en paramètre les bonne orientations.



Cependant depuis que j'ai mis l'ipad à  jour (ios 5.1), cela ne fonctionne plus correctement. La première vue initialisé fonctionne , puis les autres non . Toutes mes autres vues recoivent des events sur les rotations du device mais uniquement les orientation portrait ( plus aucuns landscape...) .



J'ai lu qu'il y avait eu des modifications sur le sujet dans les dernières version de IOS mais je n'arrive pas à  trouver la solution... Serais ce possible de m'aiguiller plz ?



Mon code utilise aussi OpenFrameWork mais mon soucis normalement est uniquement dans mes vue Cocoa.



J'ai bien setter dans les propriété de mon projets les orientations que je désiraient ( landscape ).



voici comment s'achemine mon code (globalement)
<br />
J&#39;ai une UIWindow (que l&#39;ont va nommé App dans l&#39;exemple de code)<br />
<br />
initialisation de deux vues ( UIViewController)<br />
_FUSAcceuilGUI = [[FUSAcceuilGUI alloc] initWithNibName:@&quot;FUSAcceuilGUI&quot; bundle:[NSBundle mainBundle]];<br />
<br />
_FUSPlayerGUI = [[FUSPlayerGUI alloc] initWithNibName:@&quot;FUSPlayerGUI&quot; bundle:[NSBundle mainBundle]];<br />
<br />
<br />
//On installe ensuite le navigateur controlleur<br />
_FUSNavigatorGUI = [[UINavigationController alloc] initWithRootViewController:_GUIStore];<br />
  <br />
//On cache notre navigator<br />
_FUSNavigatorGUI.navigationBarHidden = YES;<br />
<br />
//add une vue à  la uiWindow<br />
[App addSubview:FUSAcceuilGUI.view];<br />




//*****************************************************************



Ma première vue ( Accueil reçoit bien tout les événements de rotation et se réoriente.

Ensuite lorsque je change de vue :
<br />
//Delete les vues possiblement déjà  ajouter à  la UIWindow<br />
[FUSNavigatorGUI.view removeFromSuperView];<br />
[FUSAcceuilGUI.view removeFromSuperView];<br />
<br />
//add une vue à  la UIWindow<br />
[App addSubview:FUSPlayerGUI.view];<br />


//*****************************************************************



Voila globalement comme s'oriente mes changement de vue.



Merci d'avance de votre aide.



PS: si il manque des infos je me ferais un plaisir de vous les fournir.

Réponses

  • Sérieusement, ça marchait sous iOS 4.3 ?



    Pour répondre à  ta question, les changements qu'il y a eu à  propos des rotations ont eu lieu dans iOS 6 qui est encore sous NDA donc on n'en parlera pas ici.



    En ce qui concerne ta rotation, tu ne t'y prends pas du tout de la bonne façon!

    UIKit utilise à  fond le pattern MVC (même si en réalité c'est plus un pattern PAC, mais peu importe), c'est à  dire qu'il utilise les UIViewController pour faire le lien entre les vues et les données

    Et c'est justement ces UIViewController qui vont gérer la rotation.

    Ton problème ici est que tu ajoutes les vues directement à  ta hierarchie de vues au lieu d'utiliser les UIViewController pour ça.



    Je te conseille de regarder cette vidéo des CocoaHeads qui explique justement tout ça.
  • Merci .Je viens de voir le tuto, et si j'ai bien suivit,



    la méthode "shouldAutorotateToInterfaceOrientation" ne sert qu'a l'init de la vue pour savoir comment elle dois s'afficher.

    Au lieu de faire mes addSubView sur ma UIWindow il faudrait que je fasse dans mon cas : "App.rootViewController = FUSAcceuilGUI;"

    Pour effectuer mes rotations du coup je dois use les méthodes : "UIApplicationWillChangeStatusBarOrientationNotification" et "UIApplicationDidChangeStatusBarOrientationNotification" avec des blocs d'animation.

    est ce bien cela ?



    Si oui une question me trotte dans la tête. Pour quelle raison actuellement ma méthode "shouldAutorotateToInterfaceOrientation" est appelé à  chaque fois que mon device change d'orientation ( sur ma vue initiale je reçoit bien à  chaque orientation du device les événements avec les bonnes orientations, mais une fois sur un autre controller je ne reçoit plus que les portraits).
  • avant iOS 4.0 il n'y avait pas de méthode rootViewController sur UIWindow, donc le viewController de la première vue ajoutée sur la window devenait le "root viewController", et c'est lui qui recevait les événements de rotation.



    Sinon pour ton cas je pense que tu n'as pas besoind'utiliser la notification de changement de rotation,

    il te suffit d'implémenter les shouldAutorotateToInterfaceOrientation comme tu fais, mais par contre tu ne dois pas ajouter les vues de tes controlleurs "à  la main".



    Je te conseille d'avoir un UIViewController root qui ne change pas (tu peux par exemple mettre un UINavigationController, ou bien un UITabBarController, voire même un UIViewController custom) et sur ce controller root, tu viens "pusher" le controller qui t'intéresses.
  • ok je vais donc tester cela image/smile.png' class='bbc_emoticon' alt=':)' /> .
  • Au fait, je te conseille d'aller te présenter dans la section adéquate de ce forum.
  • motohimemotohime Membre
    juillet 2012 modifié #7
    Cela fonctionne à  la perfection.



    Ok je vais aller me présenter.



    Merci infiniment.
  • BooleanneBooleanne Membre
    août 2012 modifié #8
    Je crois que le sujet à  été soulevé là  :



    http://forum.cocoaca...__fromsearch__1



    Edit : zut, je n'ai pas posté où je voulais...
Connectez-vous ou Inscrivez-vous pour répondre.