How to force view controller orientation in iOS 8?

前端 未结 25 2533
太阳男子
太阳男子 2020-11-22 13:11

Before iOS 8, we used below code in conjunction with supportedInterfaceOrientations and shouldAutoRotate delegate methods to force app orie

25条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-22 13:24

    My solution

    In AppDelegate:

    func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
        if let topController = UIViewController.topMostViewController() {
            if topController is XXViewController {
                return [.Portrait, .LandscapeLeft]
            }
        }
        return [.Portrait]
    }
    

    XXViewController is the ViewController you want to support Landscape mode.

    Then Sunny Shah's solution would work in your XXViewController on any iOS version:

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

    This is the utility function to find the top most ViewController.

    extension UIViewController {
    
        /// Returns the current application's top most view controller.
        public class func topMostViewController() -> UIViewController? {
            let rootViewController = UIApplication.sharedApplication().windows.first?.rootViewController
            return self.topMostViewControllerOfViewController(rootViewController)
        }
    
    
    
        /// Returns the top most view controller from given view controller's stack.
        class func topMostViewControllerOfViewController(viewController: UIViewController?) -> UIViewController? {
            // UITabBarController
            if let tabBarController = viewController as? UITabBarController,
               let selectedViewController = tabBarController.selectedViewController {
                return self.topMostViewControllerOfViewController(selectedViewController)
            }
    
            // UINavigationController
            if let navigationController = viewController as? UINavigationController,
               let visibleViewController = navigationController.visibleViewController {
                return self.topMostViewControllerOfViewController(visibleViewController)
            }
    
            // presented view controller
            if let presentedViewController = viewController?.presentedViewController {
                return self.topMostViewControllerOfViewController(presentedViewController)
            }
    
            // child view controller
            for subview in viewController?.view?.subviews ?? [] {
                if let childViewController = subview.nextResponder() as? UIViewController {
                    return self.topMostViewControllerOfViewController(childViewController)
                }
            }
    
            return viewController
        }
    
    }
    

提交回复
热议问题