1

Je suis bloqué sur cela depuis un moment maintenant et ne peux pas comprendre comment je peux remplacer la variable "shouldAutoRotate" de TabBarController de l'enfant (contrôleur de navigation - -> TableViewController)Comment verrouiller la rotation d'un enfant TableViewController de NavigationController sur TabBarController

donc, fondamentalement, voici ma configuration TabBarController ---> Navigation Controller ---> principal TableViewController ---> VocabularyDetail TableviewController

Je sais que ci-dessous remplacements dans TabBarController va bloquer la rotation pour toutes les vues enfant.

override var supportedInterfaceOrientations : UIInterfaceOrientationMask { 
    return UIInterfaceOrientationMask.portrait 
} 

override var shouldAutorotate : Bool { 
    return false 
} 

Cependant, le défi est que je veux faire sélectivement cette dérogation selon le point de vue a été chargé dans le contrôleur de navigation. Si vous regardez l'image, le dernier contrôleur est "Vocabulary Detail" qui est celui qui devrait changer la variable "shouldAutorotate" en true. TabBar to Navigation to tableView

  • iOS 10
  • Xcode 8.2
  • Swift 3
+0

Quelqu'un? n'importe quel pointeur aiderait .... –

Répondre

0

Je fini par comprendre :) Pour ceux là qui sont coincés au même problème, voici la solution. Vous devez écrire deux extensions. Un pour le TabBarController et un pour le NavigationController. Ensuite, dans l'extension du contrôleur de navigation, vous devrez remplacer les valeurs qui vous intéressent en vérifiant la vue chargée dans la navigation.

extension UITabBarController passera essentiellement sur la valeur de l'enfant UINavigationController

extension UITabBarController { 

    override open var shouldAutorotate: Bool { 
     get { 
      if let visibleVC = selectedViewController { 
       return visibleVC.shouldAutorotate 
      } 
      return super.shouldAutorotate 
     } 
    } 

    override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{ 
     get { 
      if let visibleVC = selectedViewController { 
       return visibleVC.preferredInterfaceOrientationForPresentation 
      } 
      return super.preferredInterfaceOrientationForPresentation 
     } 
    } 

    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{ 
     get { 
      if let visibleVC = selectedViewController { 
       return visibleVC.supportedInterfaceOrientations 
      } 
      return super.supportedInterfaceOrientations 
     } 
    } 
} 

extension UINavigation vérifie la vue en cours de chargement et définissez la valeur appropriée pour les remplacements. Ci-dessous permettra essentiellement à mes écrans de pivoter, mais à l'orientation que je suis intéressé. Toutes les vues autres que Flashcard resteront dans Portrait, tandis que les cartes flash seront uniquement en mode paysage.

extension UINavigationController { 

    override open var shouldAutorotate: Bool { 
     get { 
      if let visibleVC = visibleViewController { 
       return visibleVC.shouldAutorotate 
      } 
      return super.shouldAutorotate 
     } 
    } 

    override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{ 
     get { 
      if let visibleVC = visibleViewController { 
       if visibleVC.isKind(of: FlashCardController.classForCoder()) { 
        return UIInterfaceOrientation.landscapeLeft 
       } else { 
        return UIInterfaceOrientation.portrait 
       } 
      } 
      return super.preferredInterfaceOrientationForPresentation 
     } 
    } 

    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{ 
     get { 
      if let visibleVC = visibleViewController { 
       if visibleVC.isKind(of: FlashCardController.classForCoder()) { 
        return UIInterfaceOrientationMask.landscape 
       } else { 
        return UIInterfaceOrientationMask.portrait 
       } 
      } 
      return super.supportedInterfaceOrientations 
     } 
    } 
}