我连续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()
}
})
在嵌套动画完成之前调用主动画的完成。然后我猜它不是这样做的。
你会怎么做? (为什么"最终"完成时最终没有被调用?)
答案 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