目标:
我的代码:
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才再次重复
这两个动画有时会匹配,但并不是每个版本都匹配。是否有更可靠的方法来启动第二个动画,使其恰好在初始动画的第一个完整动画的末尾开始?从那时起,它们将保持同步。感谢您的帮助!
答案 0 :(得分:0)
我对我们要实现的目标尚不清楚,但我的想法是,我们的想法是我们有两个需要重复处理的重复动画视图。为了演示如何完成此操作的示例,我选择使两个动画先放大后缩小:
这里的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一种动画恰好在另一种动画的末尾,然后重复递归地调用该函数。