从纵向到横向的快速选择性定位问题

时间:2017-04-08 05:27:30

标签: ios swift orientation landscape portrait

环境:

  • 使用最新的Xcode 8.3
  • 语言:Swift3
  • 设备全部更新(iPhone 7 v10.3.1)
  • 对于“设备”的所有选项,
  • (目标 - >部署信息 - >设备方向)设置为纵向

情景:

  • 我有两个ViewControllers(VC1和VC2),它们都继承自UIViewController。
  • VC1始终是肖像
  • VC2始终是风景
  • VC1和VC2配置了所有子视图和对象,并将其添加到viewDidLoad调用中的ViewController视图中。
  • 我通过电话从VC1呈现VC2(因为我需要一个导航栏):

    let vc2 = UINavigationController(rootViewController: VC2())
    self.present(vc2, animated: true, completion: nil)
    
  • VC2是继承自UINavigationController还是UIViewController对问题的发生没有影响。

  • AppDelegate.swift强制执行方向:

    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        if let rootViewController = self.topViewControllerWithRootViewController(rootViewController: window?.rootViewController) {
            if rootViewController is VC2 {
            let vc2 = rootViewController as! VC2
            if vc2.isPresented {
                return .landscapeRight
            }
        }
        return .portrait
    }
    
  • 上面的函数使用这个函数来查找topViewControllerWithRootViewController:

    private func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController? {
        if (rootViewController == nil) {
            return nil
        }
        if (rootViewController.isKind(of: UITabBarController.self)) {
            return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UITabBarController).selectedViewController)
        } else if (rootViewController.isKind(of: UINavigationController.self)) {
            return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UINavigationController).visibleViewController)
        } else if (rootViewController.presentedViewController != nil) {
            return topViewControllerWithRootViewController(rootViewController: rootViewController.presentedViewController)
        }
        return rootViewController
    }
    

问题:

  • 这通常总是有效,但在某些情况下,视图会导致VC2垂直呈现,属性从水平视图派生:

Here

  • 这是随机发生的,Xcode中没有显示任何错误(包括它的调试控制台)。

附加说明:

  • 请注意,在需要使用GPU的后台线程上运行任务。这些是从VC1和VC2以外的ViewControllers声明的。
  • 这可能会导致时间敏感的设备方向功能以不正确的顺序被调用。
  • 我尝试过以下链接的实现:

http://www.jairobjunior.com/blog/2016/03/05/how-to-rotate-only-one-view-controller-to-landscape-in-ios-slash-swift/

0 个答案:

没有答案