CAGroupAnimation不显示动画。单独添加动画时效果很好

时间:2015-06-11 21:25:26

标签: ios swift core-animation

我正在使用Swift和Core Animation实现一个简单的活动指标。核心动画循环仅包含两个动画。当我直接将它们添加到图层时,它们可以完美地工作。当我将它们添加为CAAnimationGroup时,根本不会发生任何事情。我完全被这种行为搞糊涂了,我已经检查了有关CAAnimationGroup的stackoverflow的所有问题,网上的所有教程,并多次阅读官方文档。我无法弄清楚发生了什么。请帮忙。

动画:

let anim1 = CABasicAnimation(keyPath: "strokeEnd")
anim1.fromValue = 0
anim1.toValue = 1.0
anim1.duration = 2.0
anim1.beginTime = CACurrentMediaTime()

let anim2 = CABasicAnimation(keyPath:"strokeStart")
anim2.fromValue = 0
anim2.toValue = 1.0
anim2.duration = 2.0
anim2.beginTime = CACurrentMediaTime() + 2.0

这完全符合预期:

shapeLayer.addAnimation(anim1, forKey:nil)
shapeLayer.addAnimation(anim2, forKey:nil)

这对我的图层没有任何作用:

let group = CAAnimationGroup()
group.animations = [anim1, anim2]
group.duration = 4.0
shapeLayer.addAnimation(group, forKey: nil)

我制作了一个简短的演示片段,用于Playground:https://gist.github.com/anonymous/6021295eab4e00b813ce。请亲自看看,帮我解决这个问题。 (如果您不确定如何使用Playground进行原型制作动画:http://possiblemobile.com/2015/03/prototyping-uiview-animations-swift-playground/

3 个答案:

答案 0 :(得分:7)

@ MDB983的回答看起来会起作用,但不能解释原因。

当您将动画直接添加到图层时,它的开始时间取决于当前的媒体时间。

将动画添加到动画组时,其“本地时间”是动画组。动画组中的开始时间为0是组的开头,1.0的beginTime是整个动画组中的1秒等。当您向动画组添加动画时,将开始时间更改为从零开始,不是从CACurrentMediaTime()开始。

答案 1 :(得分:1)

尝试这种方式,看似CACurrentMediaTime()+ 2.0导致问题

import UIKit
import XCPlayground
let view = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500))
let shapeLayer = CAShapeLayer()
let size:CGFloat = 52
let rect = CGRect(x: view.bounds.midX - size/2, y: view.bounds.midY-size/2, width: size, height: size)
shapeLayer.path = UIBezierPath(ovalInRect: rect).CGPath
shapeLayer.fillColor = UIColor.clearColor().CGColor
shapeLayer.strokeColor = UIColor.redColor().CGColor
shapeLayer.lineWidth = 3
shapeLayer.strokeStart = 0
shapeLayer.strokeEnd = 0
view.layer.addSublayer(shapeLayer)
XCPShowView("view", view)

let beginTime = CACurrentMediaTime()
let anim1 = CABasicAnimation(keyPath: "strokeEnd")
anim1.fromValue = 0
anim1.toValue = 1
anim1.duration = 2

let anim2 = CABasicAnimation(keyPath:"strokeEnd")
anim2.fromValue = 1
anim2.toValue = 0
anim2.duration = 2
anim2.beginTime =  2

let group = CAAnimationGroup()
group.duration = 4.0
group.removedOnCompletion = true
group.animations = [anim1, anim2]
//shapeLayer.addAnimation(anim1, forKey:nil)
//shapeLayer.addAnimation(anim2, forKey:nil)
shapeLayer.addAnimation(group, forKey: nil)

答案 2 :(得分:0)

我知道这是一个老问题,但是我在swift 4中对动画组做了同样的事情。我错过了为CAAnimationGroup本身指定beginTime(我假设子动画将遵循它们的beginTime)。默认情况下,CAAnimationGroup的beginTime为0.0

let group = CAAnimationGroup()
group.beginTime = CACurrentMediaTime() + delay
group.duration = 4.0
group.removedOnCompletion = true
group.animations = [anim1, anim2]