以编程方式更改方向不能正常工作

时间:2016-06-23 06:30:24

标签: ios swift orientation

我的整个应用程序都处于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,同时按住我的设备处于纵向模式,但是如果我已经将手机保持在风景中。

它没有执行所需的操作。搜索了很多关于它但尚未找到解决方案。

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

1 个答案:

答案 0 :(得分:1)

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

<强> 1。创建辅助类UIHelper并使用以下方法:

<table>
    <tr style="background-color: red;">
        <th>Example</th>
        <th>Example</th>
    </tr>
</table>

<强> 2。根据您的愿望行为创建一个协议,因为您的具体情况将是风景。

protocol orientationIsOnlyLandscape {}

Nota:如果需要,请将其添加到UIHelper类的顶部。

第3。扩展视图控制器

在你的情况下:

    /**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
    }

<强> 4。在app delegate类中添加此方法:

class B_ViewController: UIViewController,orientationIsOnlyLandscape {

   ....

}

最终备注:

  • 如果您有更多的课程处于横向模式,请延长它 协议
  • 如果您希望其他行为来自视图控制器,请创建其他协议并遵循相同的结构。
  • 此示例解决了推送后方向更改的问题 查看控制器