更改方向时,App会更改为不同的控制器视图

时间:2018-03-14 15:07:27

标签: swift xcode orientation uiinterfaceorientation

我正在使用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,上面的方法有助于在它们之间切换,一切正常。如果我移动到下一个视图或返回到主屏幕,然后返回到DosageView然后将方向更改为横向它可以工作,但如果我转到下一个视图然后从那里到Connect视图并连接(通过BLE, NFC或QR)然后返回DosageView。当我将方向更改为横向时,它将更改回“连接”视图。这两个视图之间没有直接的联系,因为您必须通过Instruction视图才能进入DosageView的Connect View,那么这怎么会发生呢?

当我在调试下运行它并在Connect View上的ViewDidLoad中放置一个断点时,它会在每次DosageView更改为Landscape时运行。如果有人能告诉我发生了什么,我会很感激,因为这让我发疯。

1 个答案:

答案 0 :(得分:0)

实际上是一位同事为我排序,正确地指出这是一个导致问题的Lottie跑叫。对于使用Lottie并遇到此问题的任何人,只需检查您的动画代码即可。我最初抄袭了Splash屏幕中的代码,如下所示

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)