首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CAAnimation正在重写以前的CAAnimation动画

CAAnimation正在重写以前的CAAnimation动画
EN

Stack Overflow用户
提问于 2018-07-29 11:52:07
回答 1查看 40关注 0票数 0

我有一个这样的场景:

  1. 我将添加到一个层CAAnimation中,该层将其转换为特定的框架。开始的时间是0。
  2. 然后,我添加了另一个CAAnimation,它将它转换成另一个框架。开始时间是0.5。

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

这是动画创作代码:

代码语言:javascript
复制
+ (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秒后开始。第一个变换立即应用到该层,第二个动画从那里开始。

你知道我怎么能把动画分开来一个接一个地运行吗?(我不喜欢使用完成块)

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-07-31 13:56:23

最简单和最明显的早期修复将是改变填充模式,以便第二个动画不会夹在两端,覆盖之前的动画。

代码语言:javascript
复制
animation.fillMode = kCAFillModeForwards;

我也会调整开始的时间

代码语言:javascript
复制
animation.beginTime = CACurrentMediaTime() + begin;

如果这是一个重叠的问题,开始时间和持续时间,而不是这个,让我知道,我也可以提供。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51580069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档