Mixer les orientations

Hello


 


Je souhaite mixer les orientations possibles pour une appli.


- pour 50% des view controllers seule l'orientation landscape est possible (y compris le launchScreen...)


- pour 50% des autres VC, toutes les orientations sont possibles


 


Est-ce que vous savez comment faire cela de façon pratique ?


 


Merci


Réponses

  • Je crois que c'est une des choses dont j'ai les pires difficultés à  réaliser de façon claire.


     


    Je dirais juste que de ma propre expérience, je déconseilles de bloquer dans les infos Xcode le téléphone en portrait. Vaut mieux laisser toutes les orientations et bloquer via le code. Je dis ça parce qu'il arrive très souvent d'avoir toute l'app en portrait mais juste 1 ou 2 vues en paysage et là  on fait des choses dégueulasse pour que ça fonctionne.


     


    Dans l'AppDelegate tu peux dire si t'es en paysage en orientation. Quand t'as 1 ou 2 vues tu peux donc gérer facilement ici quels sont ceux en portraits/paysages mais c'est pas forcément ce que je te conseilles vu ton besoin (à  moins d'avoir une archi par exemple avec un protocol pour ceux seulement en portrait et ceux en paysage ?). 


    Sinon dans chaque Controller tu peux le spécifier mais c'est là  que je bloques un peu car dans mes essais j'ai jamais pu le faire fonctionner correctement. Je dois m'y prendre très mal alors que ça parait simple.


  • Hello Magic,

    Merci pour ta réponse qui va bien m'aider je pense.


    Est-ce que tu aurais un peu de code à  partager ?


    Mais appli est plus pour l'instant 100% landscape mais j'aimerais autoriser le portrait pour un MFMessageComposer ou MFMailComposer.
  • MagiicMagiic Membre
    février 2017 modifié #4

    Oui. L'exemple avec l'AppDelegate par exemple. J'avais 2 controllers pour qui toutes les orientations étaient possibles. Le reste étant en position Portrait seulement.



    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {

    guard let wind = window, let root = wind.rootViewController else { return .portrait }

    if let topController = self.topViewControllerWithRootViewController(rootViewController: root) {
    if topController is SeePictureViewController || topController is AVPlayerViewController {
    // Unlock landscape view orientations for this view controller
    return .all
    }
    }

    // Only allow portrait
    return .portrait
    }

  • Joanna CarterJoanna Carter Membre, Modérateur

    Il y a une meilleure solution.


     


    Mais il faut savoir quels viewControllers que tu veuilles garder dans une orientation.


     


    Il faut, aussi, regarder si le viewController est dans une UITabBarController ou UINavigationController


     


    En cas de UITabBarController, tu crées une classe comme ci :



    class TabBarController: UITabBarController
    {
    override var shouldAutorotate: Bool
    {
    return self.selectedViewController?.shouldAutorotate ?? true
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask
    {
    return self.selectedViewController?.supportedInterfaceOrientations ?? .all
    }

    override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation
    {
    return self.selectedViewController?.preferredInterfaceOrientationForPresentation ?? .unknown
    }
    }

    Si le viewController est dans un UINavigationController et tu veux limiter l'orientation pour tous les viewControllers là  dedans :



    class NavigationController : UINavigationController
    {
    override var shouldAutorotate: Bool
    {
    return false
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask
    {
    return .landscape
    }

    override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation
    {
    return .landscapeRight
    }
    }

    Si tu ne veux limiter qu'un viewController dans le UINavigationController :



    class NavigationController : UINavigationController
    {
    override var shouldAutorotate: Bool
    {
    return self.visibleViewController?.shouldAutorotate ?? true
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask
    {
    return self.visibleViewController?.supportedInterfaceOrientations ?? .all
    }

    override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation
    {
    return self.visibleViewController?.preferredInterfaceOrientationForPresentation ?? .unknown
    }
    }

    Et, dans le viewController dont tu veux garder l'orientation :



    class ViewController : UIViewController
    {
    override var shouldAutorotate: Bool
    {
    return false
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask
    {
    return .landscape
    }

    override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation
    {
    return .landscapeRight
    }
    }

    Mais, de mon expérience, il faut utiliser le débogueur pour déterminer le type du selectedViewController ou visibleViewController.


     


    Et, de mon avis, il ne rime pas de forcer l'orientation d'un ou plusieurs viewController dans la même UINavigationController, car le navigationBar restera dans la même orientation est ça pourrait perturber l'utilisateur.


  • Merci de ta réponse Joanna.

    A priori mes VC ne sont pas dans des UITabBarController ni dans des UINavigationController.


    Est-ce du coup ça change quelque chose à  ta proposition ?


  • Joanna CarterJoanna Carter Membre, Modérateur


    A priori mes VC ne sont pas dans des UITabBarController ni dans des UINavigationController.


    Est-ce du coup ça change quelque chose à  ta proposition ?




     


    Si c'est le cas, comment changes-tu les viewControllers ?

  • En gros, j'ai un RootViewController dans lequel j'ai des sous-VCs qui changent.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Et comment déclenches-tu les changements ?


  • colas_colas_ Membre
    février 2017 modifié #10

    Avec des UIButton !


  • Joanna CarterJoanna Carter Membre, Modérateur

    Entre les viewControllers. Qu'est-ce qu'on doive faire pour passer d'un à  un autre ?


  • Excuse-moi Joanna, j'avais mal compris ta question.


     


    Pour passer entre les VCs, c'est des UIButton (ou des UITapGestureReco).

  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #13

    Si tu parles de ton appli improov, je peux voir que tu as un comportement comme un UINavigationController, avec les flèches pour reculer.


     


    Dans ce cas là , je dirais que tu devrais mettre le code de NavigationController dans ton "container" viewController, maintenir une référence à  ton sous viewController actuel, et que tu ajoutes le concept de visibleViewController pour le dire comment tu veux permettre son orientation.


     


    Puis, dans chaque viewController dont tu veux maintenir l'orientation, tu ajoutes le code de l'exemple ViewController.


  • OK Merci Joanna,


    Je ne vais pas coder maintenant ce mix des orientations dans l'immédiat. Je me renseignais avec un peu d'avance, mais je regarderai ta solution.

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