【问题标题】: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 {} 检查它来执行我的方法,但我想知道是否有合适的方法来做它。

标签: ios swift core-animation


【解决方案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中。
猜你喜欢
  • 2012-02-04
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多