Un UIImagePickerController qui ne veut pas se tourner!

Bonjour,


 


Je travaille sur un logiciel obligatoirement en mode paysage (dessin de boutons en cercle, en triangle, etc.  dans les UIView "calibrées" pour ce mode exclusivement).


 


J'utilise ce code source pour charger des images de l'album iOS ou bien pour prendre des photos pour un logiciel :


https://developer.apple.com/library/content/samplecode/PhotoPicker/Introduction/Intro.html


 


Le code utilisé est dans la classe :


https://developer.apple.com/library/content/samplecode/PhotoPicker/Listings/PhotoPicker_APLViewController_m.html#//apple_ref/doc/uid/DTS40010196-PhotoPicker_APLViewController_m-DontLinkElementID_7


 


Lorsque j'utilise le code sur l'iPad pour charger une image de l'album photo, une sous-page au format de l'iPhone s'affiche dans le coin de l'écran. Mais lorsque j'utilise ce code avec le simulateur iPhone (n'importe lequel), cela plante. La console m'avertit que la "UIImagePickerController" aimerait utiliser le mode portrait, ce qu'interdit l'application. Je suis coincé là -dessus depuis ce matin. Pas trouvé encore... (des sites posent le problème, pas compris non plus...)


 


Que feriez-vous?


 


Connaissez-vous "la formule" pour autoriser le "UIModalPresentationPopover" à  travailler en mode paysage? ou bien y a t-il une possibilité pour autoriser ce "UIModalPresentationPopover" à  utiliser le mode portrait, tout le reste de l'appli demeurant en mode paysage? 


 


Remarque : j'ai essayé diverses choses sur le "UIPopoverPresentationController *presentationController" du code, comme la couleur de fond par exemple, ou le frame : ceci sans effet.


 


Franchement, si vous savez, c'est super! Merci par avance.


Réponses

  • C'est très frustrant : ce bug est le dernier de mon appli avant publication!


     


    J'ai testé voir si on pouvait forcer une seule NSViewController à  accepter toutes les orientations d'écran, les autres demeurant en mode paysage, mais "self.shouldAutorotate" autant que  "self.supportedInterfaceOrientations" sont readOnly, pas moyen de forcer par là . Auriez-vous une idée?


    Sinon comment afficher ce fichu UIImagePickerControllerSourceTypePhotoLibrary sans passer par un UIModalPresentationFullScreen ? (La doc précise que ce dernier sur un iPhone ne connaà®t que l'orientation portrait. D'où le crash...)


     


    La page a un UIImageView en particulier, comment pourrais-je l'utiliser?


  • CéroceCéroce Membre, Modérateur


    J'ai testé voir si on pouvait forcer une seule NSViewController à  accepter toutes les orientations d'écran, les autres demeurant en mode paysage, mais "self.shouldAutorotate" autant que  "self.supportedInterfaceOrientations" sont readOnly, pas moyen de forcer par là . Auriez-vous une idée?




    La doc est pourrie. Tu dois surcharger les méthodes pour renvoyer ce que tu veux.

  • Merci Céroce,


     


    La doc de UIViewController explique en effet que l'on peut surcharger ("overrride") les variables "supportedInterfaceOrientation" et "preferredInterfaceOrientationForPresentation", mais comment fait-on? Car quand on clique sur le lien, ce sont effectivement des "readOnly"!


     


    Aurais-tu un petit bout de code par exemple???  :o


  • CéroceCéroce Membre, Modérateur

    En Swift ou ObjC ?


  • Je suis toujours en Objectiv-C. (beaucoup de mon code source aussi, d'où...)


     


    J'ai bien trouvé ceci :



    - (BOOL)shouldAutorotate{
    return NO;
    }

    C'est tout bête et je n'y avais pas pensé. Idem pour l'orientation.


    Par contre, que je retourne YES ou NO, la même erreur (et crash) se produit :



    Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [PUUIAlbumListViewController shouldAutorotate] is returning YES'

    Bref, toujours pas trouvé (le problème ne se rencontre que sur iPhone, pas sur iPad)


  • CéroceCéroce Membre, Modérateur

    Les orientations supportées dans l'application sont décrites dans le fichier Info.plist. à‰dite les paramètres de l'application et change les orientations permises, je pense que ça ira mieux.


  • Certes, mais si j'autorise l'application à  travailler en mode portrait, c'est la catastrophe pour la page principale car des contrôles sont dessinés par code et en mode portrait cela donne n'importe quoi.


     


    Je vais essayer d'autoriser le mode portrait pour l'appli, mais utiliser les méthodes dans la vue principale pour éviter la catastrophe. Je vous tiens au courant...


     


    Merci Céroce.


  • Ce que j'expliquais à  l'instant pourrait fonctionner. Si j'implémente ceci dans la vue principale :




    - (BOOL)shouldAutorotate{
    return NO;
    }

    - (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    return UIInterfaceOrientationMaskLandscape;
    }

    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationLandscapeRight;
    }

    l'appli présente les choses correctement, mais pas au début. Si je vais dans une autre vue et que je reviens à  la vue principale, elle s'affiche alors correctement (en mode paysage), même si je tiens l'iPad en mode portrait. Mais il faudrait que cette page soit aussi en mode paysage à  l'ouverture.  Hors quand je tiens l'ipad en mode portrait, la page s'affiche en mode portrait à  l'ouverture, et il ne le faut pas.


     


    Je lis dans la doc : (au sujet des UIViewController) :



     


    Note


    At launch time, apps should always set up their interface in a portrait orientation. After the application:didFinishLaunchingWithOptions: method returns, the app uses the view controller rotation mechanism described above to rotate the views to the appropriate orientation prior to showing the window.



    Comment forcer - étant donné que je suis obligé d'autoriser le mode portrait dans info.plist - la vue principale à  s'afficher en mode paysage à  l'ouverture de l'appli, peu importe comment je tiens l'iPad???


     


    Voilà  la question désormais...


  • J'ai fait un odieux bricolage, mais qui marche.


    Dans la classe principale :



    - (void)observeOrientation:(NSNotification *)note
    {
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait)[self performSegueWithIdentifier:@MainViewAgain sender:self];
    //un segue de la view vers la view...
    }

    Puis dans la classe qui affiche l'image :



    [[NSNotificationCenter defaultCenter] postNotificationName: @observeOrientation
    object:self];

    Cela marche évidemment, mais bon, c'est vraiment du bricolage. Auriez-vous mieux?


    Par ailleurs, "self.interfaceOrientation" is deprecated. Par quoi remplace t-on SVP??

  • Bon, ben on dira que c'était la bonne solution


     //(comparaison entre le bound.size.width et height pour la seconde question).


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