以相同的速度同时动画几个连续的UILabel到同一点

时间:2015-08-13 08:23:09

标签: ios swift core-animation uiviewanimation

我连续5次UILabel这样:

enter image description here

使用与标签1相同的框架创建它们,然后使用CGAffineTransform属性移动它们。因此,CGAffineTransformIdentity会将所有内容重新置于标签1之上。

我希望,当我按下按钮时,以相同的速度将它们全部移回标签1,一旦到达目的地,就将它们从超级视图中删除。

到目前为止,我已经完成了以下工作,但它不起作用:

var reversedLabels = getLabels().reverse()
let duration: NSTimeInterval = 5
UIView.animateWithDuration(duration, animations: {
    for (index, label) in enumerate(reversedLabels) {
        let relativeDuration: NSTimeInterval = duration * Double(index) / Double(reversedLabels.count)

        UIView.animateWithDuration(relativeDuration, animations: {
            label.transform = CGAffineTransformIdentity
            }, completion: { finished in
                label.hidden = true
        })
    }
    }, completion: { finished in
        for (index, label) in enumerate(reversedLabels) {
            label.removeFromSuperview()
        }
})

在嵌套动画完成之前调用主动画的完成。然后我猜它不是这样做的。

你会怎么做? (为什么"最终"完成时最终没有被调用?)

1 个答案:

答案 0 :(得分:1)

由于您没有动画第一个动画块中任何视图的任何可动画属性,因此完成块将在动画开始后立即执行。我不明白为什么你需要那个块。在完成内部动画时,您隐藏了标签,这与从superview中删除它们的UI行为相同,因此这段代码(没有外部动画)可能会为您带来所需的结果

for (index, label) in enumerate(reversedLabels) {

    let relativeDuration: NSTimeInterval = duration * Double(index) / Double(reversedLabels.count)

    UIView.animateWithDuration(relativeDuration, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: {

            label.transform = CGAffineTransformIdentity

            }, completion: {finished in
            label.removeFromSuperview()=
        })
}

编辑:relativeDuration应该通过向索引添加+1来计算,否则第一个动画将有0个持续时间。另外,为了使所有动画达到相同的速度,您应该使用UIViewAnimationOptions.CurveLinear