CAAnimation将覆盖以前的CAAnimation动画

时间:2018-07-29 11:52:07

标签: ios calayer caanimation ios-animations

我有一个这种情况:

  1. 我将CAAnimation添加到图层中,将其转换为特定的帧。起始时间为0。
  2. 然后,我添加另一个CAAnimation,将其转换为不同的帧。开始时间为0.5。

发生的情况是该图层立即获得第二帧(没有动画),并且在第一个动画时间过去之后,第二个动画正确完成。

这是动画创建代码:

+ (CAAnimation *)transformAnimation:(CALayer *)layer
                          fromFrame:(CGRect)fromFrame
                            toFrame:(CGRect)toFrame
                          fromAngle:(CGFloat)fromAngle
                            toAngle:(CGFloat)toAngle
                             anchor:(CGPoint)anchor
                           vertical:(BOOL)vertical
                              begin:(CFTimeInterval)begin
                           duration:(CFTimeInterval)duration {

    CATransform3D fromTransform = makeTransform(layer, fromFrame, fromAngle, anchor, vertical);
    CATransform3D midTransform1 = makeTransformLerp(layer, fromFrame, toFrame, fromAngle, toAngle, anchor, 0.33, vertical);
    CATransform3D midTransform2 = makeTransformLerp(layer, fromFrame, toFrame, fromAngle, toAngle, anchor, 0.66, vertical);
    CATransform3D toTransform = makeTransform(layer, toFrame, toAngle, anchor, vertical);

    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
    animation.values = @[[NSValue valueWithCATransform3D:fromTransform],
                         [NSValue valueWithCATransform3D:midTransform1],
                         [NSValue valueWithCATransform3D:midTransform2],
                         [NSValue valueWithCATransform3D:toTransform]
                         ];
    animation.beginTime = begin;
    animation.duration = duration;
    animation.fillMode = kCAFillModeBoth;
    animation.calculationMode = kCAAnimationPaced;
    animation.removedOnCompletion = NO;
    return animation;
}

编辑 在大多数情况下,此代码可以正常工作,并且动画顺序正确。但是,如果我将1个变换动画设置为在2秒后开始,然后将另一个变换设置为在4秒后开始。第一个转换立即应用于该图层,第二个动画从此处开始。

Any Idea如何分隔动画以一个接一个地运行? (我更喜欢不使用补全代码)

谢谢

1 个答案:

答案 0 :(得分:0)

最简单,最明显的早期修复方法是更改​​填充模式,以使第二个动画的两端都不会被钳位,从而覆盖前一个动画。

df$fruits

我也将开始时间调整为

library(dplyr)
df$fruits2 <- coalesce(df_rep$esp[match(df$fruits, df_rep$eng)], df$fruits)
df
#     fruits   fruits2
#1     apple   manzana
#2    orange   naranja
#3 pineapple pineapple
#4    banana    banana
#5     grape       uva

如果这是开始时间和持续时间重叠的问题,那么请告诉我,我也可以提供。