将多个连续的 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
我有 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