1

我正在使用以下代码为 CALayer 的不透明度属性设置动画:

在方法中创建动画:

+ (CABasicAnimation *)fadeIn:(float)begin duration:(float)duration remove:(BOOL)remove{

    CABasicAnimation *fadeAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeAnimation.fromValue = [NSNumber numberWithFloat:0.0];
    fadeAnimation.toValue = [NSNumber numberWithFloat:1.0];
    fadeAnimation.additive = NO;
    fadeAnimation.removedOnCompletion = remove;
    fadeAnimation.beginTime = begin;
    fadeAnimation.duration = duration;
    fadeAnimation.fillMode = kCAFillModeBoth;

    return fadeAnimation;
}

将动画添加到图层:

[overlayLayer addAnimation:[VideoComposerHelpers fadeIn:1.0 duration:0.5 remove:NO] forKey:nil];

这是完美的工作。但是,现在我想在第一个动画完成后向同一层添加另一个动画。

[overlayLayer addAnimation:[VideoComposerHelpers fadeOut:1.5 duration:0.5 remove:NO] forKey:nil]; // fadeOut is a method similar to fadeIn

应该发生的是,图层以 0.5 的持续时间淡入,然后立即以 0.5 的持续时间淡出。不过,这似乎不起作用。是不是因为第二个动画的起点和第一个动画的终点是一样的?

4

2 回答 2

6

你应该使用这样的CAAnimationGroup东西:

CABasicAnimation *fadeIn  = [VideoComposerHelpers fadeIn:1.0 duration:0.5 remove:NO];
CABasicAnimation *fadeOut = [VideoComposerHelpers fadeOut:1.5 duration:0.5 remove:NO];

CAAnimationGroup *group = [CAAnimationGroup animation];
group.fillMode = kCAFillModeForwards;
group.removedOnCompletion = NO;
[group setAnimations:[NSArray arrayWithObjects:fadeIn, fadeOut, nil]];
group.duration = 2;
[overlayLayer addAnimation:group forKey:@"savingAnimation"];

此外,我不确定我是否获得了正确的值,即动画的开始、结束、持续时间(你应该检查它们):))。

于 2013-05-17T16:26:11.610 回答
1

CABasicAnimation 可以有一个委托。将派出代表animationDidStop:finished:。现在您可以请求链中的下一个动画。

但是,就您而言,您甚至不需要它。只需使用autoreversesYES 的动画即可。

(哦,不要removedOnCompletionand fillMode;那是错误的,使用它们的示例同样错误。它们仅在中间复杂的分组动画中需要。)

于 2013-05-17T16:40:37.370 回答