Swift:For循环 - 在迭代之前等待动画完成

时间:2017-08-30 16:16:17

标签: ios swift animation uibutton

我正在尝试基于混洗数组显示一系列动画。

在我的ViewController上,我有4个带标签的UIButtons(1,2,3,4)。

然后我有一个shuffledArray

shuffledArray = [3,2,4,1]

我使用for循环遍历该数组并动画化UIButton的背景,如下所示:

for square in shuffledArray {
        let btn = view.viewWithTag(square)

        UIView.animate(withDuration: 1, delay: 0.0, options:[], animations: {
            btn?.backgroundColor = .red
            btn?.backgroundColor = .black
            btn?.backgroundColor = .red
        }, completion: nil)
 }

但是,这只会使4个方块同时闪烁黑色。

有没有办法运行这个循环,但是在迭代到数组的下一个索引之前等待每个动画先触发?

我尝试使用:

sleep(4)

和for循环的结束,但似乎冻结我的应用程序,然后所有4个方块同时更改。

旁注

点击按钮可激活此for循环。在for循环运行后,我生成一个介于1和4之间的随机数,然后将其附加到shuffledArray。所以它开始于:

 shuffledArray = [3]

然后是第二次

 shuffledArray = [3,2]

第三个

 shuffledArray = [3,2,4]

依旧......

问题似乎只发生在数组包含多个项目时。

2 个答案:

答案 0 :(得分:0)

尝试这样的事情? (未经测试)

var currentIndex = 0 
func animateNext() {
    if currentIndex < shuffledArray.count {  
        let btn = view.viewWithTag(shuffledArray[currentIndex])
        UIView.animate(withDuration: 1, delay: 0.0, options:[.autoreverse], animations: {
            btn?.backgroundColor = .red
            btn?.backgroundColor = .black
        }) { _ in
            self.currentIndex += 1
            self.animateNext()
        }
    }
}

答案 1 :(得分:0)

尝试使用delay属性,如下所示:

for (index, square) in shuffledArray.enumerated() {
        let btn = view.viewWithTag(square)

        UIView.animate(withDuration: 1, delay: index, options:[], animations: {
            btn?.backgroundColor = .red
            btn?.backgroundColor = .black
            btn?.backgroundColor = .red
        }, completion: nil)
    }

<强>更新: