不同对象上的多个动画同时完成并最终完成
Posted
技术标签:
【中文标题】不同对象上的多个动画同时完成并最终完成【英文标题】:Multiple animations on different objects at the same time with a final completion 【发布时间】:2015-09-19 01:54:55 【问题描述】:基本上,我有一个UITableView
,我想在点击按钮时对其进行动画处理。每个单元格应按 1.10 缩放并返回其变换标识。这就是我使用UIView.animateKeyframesWithDuration
为每个单元格制作的两个不同动画。
但我想让它们彼此稍微延迟。所以我在这样的循环中调用这个方法:
for (index, cell) in tableView.visibleCells.enumerate()
let delay = 0.1 * Double(index)
let duration = 0.5
UIView.animateKeyframesWithDuration(duration, delay: delay, options: [], animations:
UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: duration * 1/2, animations:
cell.transform = CGAffineTransformScale(cell.transform, 1.10, 1.10)
)
UIView.addKeyframeWithRelativeStartTime(1/2, relativeDuration: duration * 1/2, animations:
cell.transform = CGAffineTransformIdentity
)
, completion: nil)
问题是完成部分仅适用于每个动画。
我正在寻找一种在每个动画完成后做某事的方法。我怎样才能做到这一点?
【问题讨论】:
你不觉得你的问题有矛盾吗?可以为每个动画调用完成块,并且您想在每个动画完成后执行一些操作... ??您的意思是要为每个单元格调用一个方法(在单元格上的 2 个关键帧动画完成后)? 好吧,让我们假设每个对象只有一个动画。我只想在所有动画完成后调用一个方法。我考虑过创建一个包含要执行的动画数量的计数器,在每个动画块完成时将其递减,并在它变为 0 时通过使用didSet
检查它来执行我的方法,但我想知道是否有合适的方法来做它。
【参考方案1】:
您可以将所有内容包装在 UIView.animateKeyframesWithDuration
调用中并像这样调用单个完成块:
let delay = 0.1
let duration = 0.5
let totalDuration = duration + TimeInterval(tableView.visibleCells.count - 1) * delay
UIView.animateKeyframes(
withDuration: totalDuration/2,
delay: 0,
options: [],
animations:
for (index, cell) in self.tableView.visibleCells.enumerated()
let relativeDelay = delay * Double(index)
print("Cell \(index) animation starts after relative delay: \(relativeDelay)")
UIView.addKeyframe(withRelativeStartTime: relativeDelay, relativeDuration: duration/2, animations:
cell.transform = cell.transform.scaledBy(x: 1.10, y: 1.10)
)
UIView.addKeyframe(withRelativeStartTime: relativeDelay + duration/2, relativeDuration: duration/2, animations:
cell.transform = CGAffineTransform.identity
)
, completion: finished in
if finished
print("Done")
)
我希望这是你想要的。
【讨论】:
谢谢。我没想过要把我的循环放在animateKeyframesWithDuration
中。以上是关于不同对象上的多个动画同时完成并最终完成的主要内容,如果未能解决你的问题,请参考以下文章