【发布时间】:2019-04-18 01:32:19
【问题描述】:
目标:
- 第一个动画的持续时间为 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 才再次重复
这两个动画有时会匹配,但不是在每个构建中都匹配。有没有更可靠的方式来启动第二个动画,以在初始动画的第一个完整动画结束时开始?这样他们就会从那时起保持同步。感谢您的帮助!
【问题讨论】:
-
我建议去掉第一个动画自动反转和重复计数。只需将整个事情描述为单独的动画,然后让小组进行重复。
-
@matt 如果将第一个动画(使用自动反转,我可以分成 2 个动画)添加到一个图像视图的图层,并且第二组动画(缩放和淡入淡出)在第二个不同的 imageview - 你还会推荐类似的东西吗?每个组都将附加到不同的视图......使用 UIView.animate 及其完成:块会更好吗?
-
哦,是的,对不起,我明白了,你不能在两个不同的层上做一个组!必须通过完成处理程序链接。可以使用视图或图层来做到这一点。使用递归来获得重复。
标签: ios swift animation timing caanimation