更改方向时应用更改为不同的控制器视图

App changes to different controller view when changing orientation

我正在使用 Xcode 9.2 和 swift 4 开发一个应用程序,我需要只允许我的应用程序中的一个视图更改为横向,所以我将下面的代码添加到我的 AppDelegate

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if globalVariables.gIsDosageView == "Y" {
        if UIDevice.current.orientation == .landscapeLeft || UIDevice.current.orientation == .landscapeRight {
            return UIInterfaceOrientationMask.all;
        } else {
            return UIInterfaceOrientationMask.portrait;
        }
    } else {
        return UIInterfaceOrientationMask.portrait;
    }
}

全局变量在所有其他控制器上设置为 "N",因此只有 DosageView 将其设置为 "Y"。在 DosageView 控制器中,我添加了这个方法来帮助转换。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    hideViews()
    if size.width < 400 {
        DispatchQueue.main.async() {
            self.userImg.isHidden = false
            self.burgerImg.isHidden = false
            self.deviceImg.isHidden = false
            self.portraitView.isHidden = false
            self.landscapeView.isHidden = true
        }
    }
    else {
        DispatchQueue.main.async() {
            self.userImg.isHidden = true
            self.burgerImg.isHidden = true
            self.deviceImg.isHidden = true
            self.portraitView.isHidden = true
            self.landscapeView.isHidden = false
            self.loadLandscapeView()
        }
    }
}

我已经设置了一个 LandscapeView 和一个 PortraitView,上面的方法有助于在它们之间切换,一切正常。如果我移动到下一个视图或 return 到主屏幕,然后 return 到 DosageView,然后将方向更改为 Landscape 它工作但如果我转到下一个视图然后从那里到连接视图并连接(通过 BLE、NFC 或 QR)然后 returns 到 DosageView。当我将方向更改为横向时,它会变回连接视图。这两个视图之间没有直接 link,因为您必须通过 Instruction 视图才能到达 DosageView 的 Connect View,所以这怎么会发生呢?

当我 运行 它处于调试状态并在 Connect View 的 ViewDidLoad 中放置断点时,每次 DosageView 更改为 Landscape 时都会 运行s。如果有人能告诉我发生了什么事,我将不胜感激,因为这让我发疯。

实际上是一位同事帮我解决了这个问题,正如他正确指出的那样,是 Lottie 运行 调用导致了问题。对于使用 Lottie 并遇到此问题的任何人,只需检查您的动画代码即可。我最初从启动画面中抄袭代码如下

splashAnimation!.loopAnimation = false
    splashAnimation!.play(fromProgress: 0,
                        toProgress: 1.0,
                        withCompletion: { (finished) in
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "Menu")
        self.present(controller, animated: true, completion: nil)
    })

此代码在完成后移至主屏幕时工作正常。但是,导致问题的屏幕在两个不同的屏幕之间移动,为了解决这个问题,我的同事简单地删除了 withCompletion 部分,如下所示

splashAnimation!.loopAnimation = true
            splashAnimation!.play(fromProgress: 0,
                                  toProgress: 1.0)