如果应用程序转到后台,则UIView动画不起作用

时间:2016-06-30 17:36:09

标签: swift uiviewanimation

我有一个小问题游戏,如果用户需要太长时间才能回答,它会超时并自动触发自定义segue到某个屏幕。

    let firstClassView = self.sourceViewController.view
    let secondClassView = self.destinationViewController.view
    let screenWidth = UIScreen.mainScreen().bounds.size.width
    let screenHeight = UIScreen.mainScreen().bounds.size.height
    firstClassView.clipsToBounds = true
    secondClassView.clipsToBounds = true
    let secondClassFrame = CGRect(x: screenWidth, y: 0, width: screenWidth, height: screenHeight)
    secondClassView.frame = secondClassFrame
    guard let window = UIApplication.sharedApplication().keyWindow else {
        return
    }
    window.insertSubview(secondClassView, aboveSubview: firstClassView)
    if let questionVC = self.destinationViewController as? QuestionResultViewController {
        questionVC.prepareResultView()
    }
    UIView.animateWithDuration(0.4, animations: { () -> Void in
        firstClassView.frame = CGRectOffset(firstClassView.frame, -screenWidth, 0)
        secondClassView.frame = CGRectOffset(secondClassView.frame, -screenWidth, 0)
    }) {_ -> Void in
        self.sourceViewController.presentViewController(self.destinationViewController, animated: false, completion: nil)
    }

此代码和segue工作正常,除非用户在segue之前将应用程序发送到后台(并再次打开)。在这种情况下,到达UIView.animate块,但它的内容似乎永远不会被调用,所以没有动画播放! (我在那里得到了一个打印命令,它没有被触发)

如果我的描述令人困惑:

案例1:

  • 用户到达问题屏幕

  • 问题的计时器超时

  • Segue触发器

  • 达到动画块并完美播放

案例2:

  • 用户到达问题屏幕

  • 将应用程序发送到后台

  • 再次打开应用

  • 问题的计时器超时

  • Segue触发器

  • 已达到动画块,但没有任何反应 - > ???

为什么会这样?我尝试使用layoutIfNeeded和它的变体,但没有任何效果。永远不会调用动画块的内容。 从我使用断点的测试中,应用程序在到达UIView行之前完全停止(并在约10秒后结束崩溃)。

1 个答案:

答案 0 :(得分:1)

事实证明它与UIView块没有任何关系。我有一个自定义的UILabel类,它的layoutSubviews方法在应用程序转到后台后进入了一个无法检测的无限循环。

很抱歉这个混乱。