使用UIView.animate执行代码的顺序

时间:2018-06-20 17:55:42

标签: ios swift uiviewanimation

我的代码有问题,下面的简化版本对此进行了说明。我希望在“ 1”之前打印“ 2”。但是,事实并非如此。

这与代码实际上没有从上到下运行有关吗?

if moveConclusion.patternDetected == true {
    for i in 0...8 {
        if pressedArray[i] {
            self.panlButtons[i].backgroundColor = UIColor.clear

            UIView.animate(withDuration: 0.1, animations:{
                self.panlButtons[i].backgroundColor = self.correctColour
                //self.panlButtons[i].transform = CGAffineTransform(rotationAngle: CGFloat.pi / -12)
            }, completion: { finished in
                UIView.animate(withDuration: 0.1, animations:{
                    self.panlButtons[i].backgroundColor = UIColor.clear
                    // self.panlButtons[i].transform = CGAffineTransform(rotationAngle: CGFloat.pi / 12)
                    print("2")
                })
            })
        }
    }
    print("1")
}

输出:

  

1
  2
  2
  2
  ...

3 个答案:

答案 0 :(得分:3)

调用UIView.animate 命令动画;它不能执行它。动画引擎将在稍后执行它。您将向动画引擎交付两个要在以后执行的代码块,这意味着之后所有代码都结束了(从技术上讲,这是下一个屏幕刷新帧到来的时候)以及当前的CATransaction已提交):

  • animations块将在您所有代码完成后运行,现在是动画开始的时候了。

  • completion块将在动画结束之后运行(这就是“完成”的意思)。

答案 1 :(得分:0)

这是因为print("2")在此代码开始后大约执行0.1-0.2秒,而print("1")在for循环执行之后发生。

动画不能与for循环同步执行。 print("2")将在第二个动画期间发生,但是到那时,for循环已完成,print("1")已执行。

答案 2 :(得分:0)

UIView.animate在主线程上运行,并且是异步的。因此,一旦调用该代码,它便将其分派到NEXT运行循环中(在此函数终止之后,即在整个for循环之后)。

换句话说,UIView.animate调用实际上只是将其排队等待下一个运行循环。并且print("1")语句仍出现在当前运行循环中。

然后运行动画块,并且一旦动画块完成,则完成块将运行。因此,就CPU处理而言,2的印刷版稍后会出现WAAAAAY,这绝对是预期的行为。