以编程方式更改方向无法正常工作

我的整个应用程序是在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,而我的设备在纵向模式下,但如果我把我的手机横向已左。

它不执行所需的操作。 search了很多关于它,但无法find解决scheme呢。

我已经尝试了很多解决scheme,但没有正常工作。

这是您的问题和其他相关问题的通用解决scheme。

1.创build辅助类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.用你的愿望行为创build一个协议,为你的具体情况将景观。

协议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 } 

最后说明:

  • 如果你有更多的课程在横向模式,只要扩展该协议即可。
  • 如果你想从视图控制器的其他行为,创build其他协议,并遵循相同的结构。
  • 这个例子解决推视图控制器后方向改变的问题