2016-06-23 117 views
2

我的整个应用程序都在portrait模式下。我只想在landscape模式下使用一个视图控制器(左图)。以编程方式更改方向无法正常工作

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask 
{ 
    if let _navigationController = window?.rootViewController as? UINavigationController { 

     if _navigationController.topViewController is FullScreenPlayerVC { 

      return UIInterfaceOrientationMask.LandscapeLeft 
     } 
    } 

    return UIInterfaceOrientationMask.Portrait 
} 

这是我的控制器A

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

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask 
{ 
    return UIInterfaceOrientationMask.Portrait 
} 

现在我把控制器B.这是我的控制器B

override func viewDidAppear(animated: Bool) 
{ 
    super.viewDidAppear(animated) 

    let value = UIInterfaceOrientation.LandscapeLeft.rawValue 
    UIDevice.currentDevice().setValue(value, forKey: "orientation") 
} 

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

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask 
{ 
    return UIInterfaceOrientationMask.Landscape 
} 

它可以按我的要求时,我把控制器B同时举行我的设备处于肖像模式,但是如果我已将手机搁置在横向模式中。

它不执行所需的操作。搜索了很多关于它的信息,但还没能找到解决方案。

我已经尝试了许多解决方案,但没有正常工作。

+0

后取向的变化问题只是用下面的代码,内部代码不需要DidAppear。覆盖func supportedInterfaceOrientations() - > UIInterfaceOrientationMask { return .Landscape } –

+0

试过这个,但很有用的不幸:( – kashifasif

回答

1

这是针对您的问题和其他相关问题的通用解决方案。

1.创建附配类UIHelper并把下面的方法:

/**This method returns top view controller in application */ 
    class func topViewController() -> UIViewController? 
    { 
     let helper = UIHelper() 
     return helper.topViewControllerWithRootViewController(rootViewController: UIApplication.shared.keyWindow?.rootViewController) 
    } 

    /**This is a recursive method to select the top View Controller in a app, either with TabBarController or not */ 
    private func topViewControllerWithRootViewController(rootViewController:UIViewController?) -> UIViewController? 
    { 
     if(rootViewController != nil) 
     { 
      // UITabBarController 
      if let tabBarController = rootViewController as? UITabBarController, 
       let selectedViewController = tabBarController.selectedViewController { 
       return self.topViewControllerWithRootViewController(rootViewController: selectedViewController) 
      } 

      // UINavigationController 
      if let navigationController = rootViewController as? UINavigationController ,let visibleViewController = navigationController.visibleViewController { 
       return self.topViewControllerWithRootViewController(rootViewController: visibleViewController) 
      } 

      if ((rootViewController!.presentedViewController) != nil) { 
       let presentedViewController = rootViewController!.presentedViewController; 
       return self.topViewControllerWithRootViewController(rootViewController: presentedViewController!); 
      }else 
      { 
       return rootViewController 
      } 
     } 

     return nil 
    } 

2.你的愿望行为创建协议,为您的特定情况下,将景观。

协议orientationIsOnlyLandscape {}

诺塔:如果你想在UIHelper类的顶部添加。

3.扩展您的视图控制器

你的情况:

class B_ViewController: UIViewController,orientationIsOnlyLandscape { 

    .... 

} 

4.在应用程序委托类中添加这个方法:

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 
     let presentedViewController = UIHelper.topViewController() 
     if presentedViewController is orientationIsOnlyLandscape { 
      return .landscape 
     } 
     return .portrait 
    } 

最后说明:

  • 如果您认为更多课程处于横向模式,则只需扩展该协议即可。
  • 如果您需要视图控制器中的其他行为,请创建其他协议并遵循相同的结构。
  • 该实施例解决了与推 视图控制器
相关问题