我有一个小问题游戏,如果用户回答问题的时间过长,它将超时并自动将自定义序列触发到特定屏幕。

    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:


用户到达问题屏幕
问题的计时器超时
触发触发器
达到动画块并完美播放


情况2:


用户到达问题屏幕
将应用程序发送到后台
再次打开应用
问题的计时器超时
触发触发器
到达动画块,但是什么也没发生-> ???


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

最佳答案

事实证明,它与UIView块无关。我有一个自定义的UILabel类,当应用程序进入后台后,它的layoutSubviews方法进入了不可检测的无限循环。

对困惑感到抱歉。

关于swift - 如果应用程序进入后台,则UIView动画不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38129873/

10-12 00:19
查看更多