具有交错开始时间的 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的主要内容,如果未能解决你的问题,请参考以下文章

颤动中具有相同单元格高度的动态交错网格

交错形状不匹配的 NumPy 数组

在 Python 中随机交错 2 个数组

在两个方向上工作的交错网格布局管理器

Android 交错 GridView

切换到使用交错 VBO - 编译但没有绘制 - opengl es 2.0