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

Animating several consecutive UILabels at the same speed at the same time to the same point

我有 5 个连续的 UILabel 像这样:

它们是使用与标签 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()
        }
})

在嵌套动画完成之前调用主动画的完成。那我想这不是办法。

你会怎么做? (以及为什么 "final" 完成没有在最后调用?)

由于您没有为第一个动画块内的任何视图的任何可动画 属性 设置动画,因此完成块将在动画开始后立即执行。我无法理解的是为什么你根本需要那个块。完成内部动画后,您将隐藏标签,这与从超级视图中删除标签的行为相同 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