2

Это более или менее моя Main.storyboard ситуация:Swift: правильно ли назначить пользовательский класс для всех UINavigationControllers?

enter image description here

, где у меня есть корень UITabBarController с 5 вариантов possibile. Затем, я хочу, чтобы некоторые UIViewController s могли поворачиваться к пейзажу, в то время как я хочу также некоторые другие UIViewController s, чтобы иметь только ландшафтный режим. Поэтому я написал эту file.swift:

class CustomNavigationController: UINavigationController, UINavigationControllerDelegate { 

    override func shouldAutorotate() -> Bool { 
    if (self.topViewController?.isKindOfClass(HomeViewController) != nil) {return false} 
    else if (self.topViewController?.isKindOfClass(ServicesViewController) != nil) {return false} 
    else if (self.topViewController?.isKindOfClass(PhotoGalleryViewController) != nil) {return false} 
    else if (self.topViewController?.isKindOfClass(SelectMapViewController) != nil) {return false} 
    else if (self.topViewController?.isKindOfClass(MapViewController) != nil) {return false} 
    else {return true} 
    } 

} 

class CustomTabBarController: UITabBarController, UITabBarControllerDelegate { 
    override func shouldAutorotate() -> Bool { 
    return (self.selectedViewController as! UINavigationController).shouldAutorotate() 
    } 
} 

и я передал все UINavigationController S тот же класс CustomNavigationController в то время как я назначен CustomTabBarController класс UITabBarController. В результате контроллер просмотра не вращается. Это потому, что я назначил для них один и тот же класс? Должен ли я создать собственный класс контроллера навигации для каждого UINavigationController У меня есть?

UPDATE

Частичное решение, которое я нашел, даже если это немного запутанным, состоит в следующем. Я изменил предыдущий файл так:

class CustomNavigationController: UINavigationController, UINavigationControllerDelegate { 

override func shouldAutorotate() -> Bool { 
    return (self.topViewController?.shouldAutorotate())! 
} 

} 

класс CustomTabBarController: UITabBarController, UITabBarControllerDelegate { переопределения Func shouldAutorotate() -> Bool { возвращение (self.selectedViewController в UINavigationController!) .shouldAutorotate() } }

Затем, в контроллерах зрения, когда вращение разрешено я просто:

override func shouldAutorotate() -> Bool { 
    return true 
} 

, а в контроллерах зрения, где вращение не допускается у меня есть:

override func shouldAutorotate() -> Bool { 
    return false 
} 

override func viewWillAppear(animated: Bool) { 
    let value = UIInterfaceOrientation.Portrait.rawValue 
    UIDevice.currentDevice().setValue(value, forKey: "orientation") 
} 

Во всяком случае, есть небольшая проблема, так как анимация, которая устанавливает режим портрета не правильное значение, что ширина экрана не регулируется. если я перехожу от контроллера ландшафтного вида к диспетчеру только для портрета, тогда рамка контроллера просмотра неверна. Я получаю

enter image description here

вместо этого:

enter image description here

ответ

1

Попробуйте это в AppDelegate

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask { 
    if let rootController = self.window?.rootViewController as? UITabBarController { 
     if let navigationController = rootController.selectedViewController as? UINavigationController { 
      let controller = navigationController.topViewController! 

      if controller.isKindOfClass(HomeViewController.classForCoder()) { 
       return UIInterfaceOrientationMask.Portrait 
      } 
      if controller.isKindOfClass(ServicesViewController.classForCoder()) { 
       return UIInterfaceOrientationMask.Portrait 
      } 
      if controller.isKindOfClass(PhotoGalleryViewController.classForCoder()) { 
       return UIInterfaceOrientationMask.Portrait 
      } 
      if controller.isKindOfClass(SelectMapViewController.classForCoder()) { 
       return UIInterfaceOrientationMask.Portrait 
      } 
      if controller.isKindOfClass(MapViewController.classForCoder()) { 
       return UIInterfaceOrientationMask.Portrait 
      } 
     } 
    } 
    return UIInterfaceOrientationMask.All 
} 

Update:

Этот метод силы приложения, чтобы изменить ориентацию в ViewCo ntroller, которые должны быть только в портретном (HomeViewController, ServicesViewController, PhotoGalleryViewController, SelectMapViewController, MapViewController):

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    let value = UIInterfaceOrientation.Portrait.rawValue 
    UIDevice.currentDevice().setValue(value, forKey: "orientation") 
} 
+0

Спасибо за ваше предложение, но я боюсь, что это не работает ... все они вращаются без исключения :( –

+0

@LoryLory жаль, что я отредактировал свой ответ.Предыдущий работал только с представленным контроллером. Это должно работать. Кроме того, он будет работать даже без CustomNavigationController. Попробуйте это;) –

+0

ОК, это работает, но теперь у меня есть проблема, описанная в моем обновлении вопроса: если я перехожу из контроллера ландшафтного представления к диспетчеру только для портрета, тогда рамка контроллера представления не верна. Сними новые изображения. –