我正在尝试基于混洗数组显示一系列动画。
在我的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]
依旧......
问题似乎只发生在数组包含多个项目时。
答案 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)
}
<强>更新:强>
CAAnimationGroup
(https://developer.apple.com/documentation/quartzcore/caanimationgroup)CAKeyframeAnimation
- 用于眨眼效果(https://developer.apple.com/documentation/quartzcore/cakeyframeanimation)