具有交错开始时间的 CAKeyframeAnimation
Posted
技术标签:
【中文标题】具有交错开始时间的 CAKeyframeAnimation【英文标题】:CAKeyframeAnimation with staggered begin time 【发布时间】:2018-12-06 16:56:02 【问题描述】:我正在尝试创建一个动画,其中项目在时间上交错显示。为此,我使用了 CAKeyframeAnimation,但为了实现惊人的效果,我需要指定 beginTime
。
问题是我还希望动画在完成时不要回弹到原始位置,所以我在模型上指定如下值:view.layer.transform = CATransform3DIdentity
之前动画是添加到图层。
但是,由于我指定了 beginTime,因此动画会快速回到初始位置。有没有办法解决这个问题?
func addAnimation(view: UIView, index: Int)
let values = RK4SpringAnimation(tension: 600, friction: 60, initialVelocity: 0) // just provides an array of values between 0.0 and 1.0.
let positions = values.map Float(view.layer.frame.width) - (Float($0) * Float(view.layer.frame.width))
let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
animation.values = positions
animation.duration = 0.716
animation.beginTime = CACurrentMediaTime() + Double(index) * 0.015
view.layer.transform = CATransform3DIdentity // set the final value on the model.
view.layer.add(animation, forKey: "transform2")
【问题讨论】:
【参考方案1】:添加动画后,应将属性值设置为动画的最终值。最终值是CATransform3DIdentity
吗?
如果动画的beginTime
在未来,并且动画的开始值不等于结束值,那么你可以设置animation.fillMode = .backwards
告诉Core Animation将动画的开始值应用到层直到@987654324到达@。
func addAnimation(view: UIView, index: Int, show: Bool)
let values = RK4SpringAnimation(tension: 600, friction: 60, initialVelocity: 0) // just provides an array of values between 0.0 and 1.0.
let positions = values.map Float(view.layer.frame.width) - (Float($0) * Float(view.layer.frame.width))
let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
animation.values = positions
animation.duration = 0.716
animation.beginTime = CACurrentMediaTime() + Double(index) * 0.015
animation.fillMode = .backwards
view.layer.add(animation, forKey: animation.keyPath)
view.layer.setValue(positions.last!, forKey: animation.keyPath!)
【讨论】:
【参考方案2】:我用来解决此问题的一种方法是为您的动画设置CAAnimationDelegate
并实现animationDidStop(CAAnimation, finished: Bool)
。创建对视图层的引用,并在动画完成后设置所需的变换。
【讨论】:
这种方法的问题是视图是图层的委托,所以除非我添加另一个图层,否则这将无法正常工作?在这种情况下,视图是 UILabels... 每个CAAnimation
对象都可以有自己的委托,独立于层的委托。
您将代理设置为“CAAnimation”,而不是为其应用的图层。 'CAAnimationDelegate' 将接收动画开始和结束的回调。这种方法的实际问题是,“CAAnimation”没有对图层的引用,它被应用于...以上是关于具有交错开始时间的 CAKeyframeAnimation的主要内容,如果未能解决你的问题,请参考以下文章