不同对象上的多个动画同时完成并最终完成

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中。

以上是关于不同对象上的多个动画同时完成并最终完成的主要内容,如果未能解决你的问题,请参考以下文章

在Vue中使用GSAP完成动画(一)

Js实现动画框架

同时将一个动画应用于多个视图

将多个文件关联到同一个 io 完成端口,同时保持文件流顺序 c#

游戏如何删除数据库中的对象但同时对其进行动画处理

第一百四十五节,JavaScript,同步动画