Swift:重复的连续CABasicAnimations

时间:2019-04-18 01:32:20

标签: ios swift animation timing caanimation

目标:

  • 第一个动画的运行时间为1.0
  • 在1.0处,第二个动画运行(而第一个动画自动倒回其起点)
  • 在2.0版本中,第一个动画返回其起点,第二个动画已经完成,并且第一个动画重复
  • 在3.0处,第二个动画在第一个动画结束其第二个运行时运行

我的代码:

let animation = CABasicAnimation(keyPath: "transform.scale")
        animation.fromValue = 1.0
        animation.toValue = 1.5
        animation.duration = 1.0
        animation.autoreverses = true
        animation.repeatCount = .greatestFiniteMagnitude
        image1.layer.add(animation, forKey: animation.keyPath)

        let animation2 = CABasicAnimation(keyPath: "transform.scale")
        animation2.fromValue = 1.0
        animation2.toValue = 2.0
        animation2.duration = 1.0
        animation2.fillMode = .forwards

        let animation2b = CABasicAnimation(keyPath: "opacity")
        animation2b.fromValue = 1.0
        animation2b.toValue = 0.0
        animation2b.duration = 1.0
        animation2b.fillMode = .forwards

        let animationGroup = CAAnimationGroup()
        animationGroup.animations = [animation2, animation2b]
        animationGroup.duration = 2.0
        animationGroup.beginTime = 1.0
        animationGroup.repeatCount = .greatestFiniteMagnitude
        image2.layer.add(animationGroup, forKey: "scaleAndFade")

目标是在第一个动画之后开始第二个动画1.0。并且由于动画组的持续时间为2.0,而其中的动画的持续时间仅为1.0,因此动画将从1.0开始,以2.0结束,然后直到3.0才再次重复

这两个动画有时会匹配,但并不是每个版本都匹配。是否有更可靠的方法来启动第二个动画,使其恰好在初始动画的第一个完整动画的末尾开始?从那时起,它们将保持同步。感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我对我们要实现的目标尚不清楚,但我的想法是,我们的想法是我们有两个需要重复处理的重复动画视图。为了演示如何完成此操作的示例,我选择使两个动画先放大后缩小:

enter image description here

这里的gif动画经过几次重复后就结束了,但实际上重复是永远的。

简单地实现如下:

func step1() {
    UIView.animate(withDuration: 1, animations: {
        self.v1.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
        self.v2.transform = .identity
    }) { _ in
        DispatchQueue.main.async {
            self.step2()
        }
    }
}

func step2() {
    UIView.animate(withDuration: 1, animations: {
        self.v1.transform = .identity
        self.v2.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
    }) { _ in
        DispatchQueue.main.async {
            self.step1()
        }
    }
}

要点是动画的各个阶段永远不会在两个视图之间不同步,因为每个阶段都涉及两个视图和跟进。因此,我很确定您可以采用这种方法来适合您的动画。

答案 1 :(得分:0)

我喜欢@matt的回答,并且总是感谢他们的输入,但是由于我尝试使用CAAnimation(特别是我想使用CAKeyframeAnimation),所以我最终使用CATransaction.begin()CATransaction.setCompletionBlock嵌套了两个CATransactions一种动画恰好在另一种动画的末尾,然后重复递归地调用该函数。

CATransaction documentation