CALayer 动画还原

Posted

技术标签:

【中文标题】CALayer 动画还原【英文标题】:CALayer animation reverts 【发布时间】:2013-04-04 13:16:11 【问题描述】:

我一直在尝试制作CALayer 动画。但是在动画之后它又恢复了。我找到了一些解决方案,比如removedOnCompleteion = YESfill mode = kCAFillModesForwards,但没有一个对我有帮助。这是代码。需要一点帮助,谢谢。

  void(^ myblock)(NSDictionary *) = ^(NSDictionary *dict)

        NSMutableArray *arrOfPt=       [dict objectForKey:@"Path"];

        CGPoint p1 = [[arrOfPt objectAtIndex:0] CGPointValue];

        CGPoint cp1 = [[arrOfPt objectAtIndex:1] CGPointValue];

//        CGPoint cp1 = [[arrOfPt objectAtIndex:1] CGPointValue];
        CGPoint cp2 = [[arrOfPt objectAtIndex:2] CGPointValue];
        CGPoint p2 = [[arrOfPt objectAtIndex:3] CGPointValue];

        NSMutableArray *arrayTime =  [dict objectForKey:@"Time"];
        CGFloat time = [[arrayTime objectAtIndex:0] floatValue];

        pointerLayer.opacity = 1;
//        NSArray *oneObjPt = [NSArray arrayWithObjects:[arrOfPt objectAtIndex:0],[arrOfPt lastObject],nil];
        //         NSArray *oneObjTime = [NSArray arrayWithObjects:[arrayTime objectAtIndex:0],[arrayTime lastObject],nil];
//        NSArray *oneObjTime = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0],[NSNumber numberWithFloat:1.0],nil];
        CAKeyframeAnimation *keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];

//        [keyFrameAnimation setCalculationMode:kCAAnimationPaced];
        keyFrameAnimation.duration = 1;
        keyFrameAnimation.removedOnCompletion = NO;
        [keyFrameAnimation setFillMode:kCAFillModeForwards];

        CGMutablePathRef fpath = CGPathCreateMutable();

        CGPathMoveToPoint(fpath, NULL, p1.x, p1.y);
        CGPathAddCurveToPoint(fpath, NULL, cp1.x, cp1.y, cp2.x, cp2.y, p2.x, p2.y);
        keyFrameAnimation.path = fpath;

        [pointerLayer addAnimation:keyFrameAnimation forKey:@"pos"];
        CGPoint newLoc = pointerLayer.position;// this is just to verify the layer's location

【问题讨论】:

【参考方案1】:

我找到了一些解决方案,例如 removedOnCompleteion = YES 和填充模式 = kCAFillModesForwards

那些不是解决方案。

CGPoint newLoc = pointerLayer.position;

那不会有任何好处;添加动画实际上并不会改变位置。动画发生在稍后

我不完全确定你在追求什么,但它可能会帮助你阅读我对 Core Animation 的解释。动画只是一种幻觉;这是一个使用“表示层”玩的游戏。 真实层移动到动画之后的位置添加将出现的动画让它移动到那里。

我提供了一种公式化的方法来确保您的核心动画能够将您带到您想去的地方:

http://www.apeth.com/iosBook/ch17.html#_using_a_cabasicanimation

【讨论】:

【参考方案2】:

我似乎无法重新创建这个 - 当然我使用了一些测试数据:

CGPoint cp1 = CGPointMake(0, 0);
CGPoint cp2 = CGPointMake(100, 100);
CGPoint cp3 = CGPointMake(85, 150);
CGPoint cp4 = CGPointMake(50, 50);
CGFloat time = 2.0f;
CAKeyframeAnimation *keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
keyFrameAnimation.duration = time;
keyFrameAnimation.removedOnCompletion = NO;
[keyFrameAnimation setFillMode:kCAFillModeForwards];

CGMutablePathRef fpath = CGPathCreateMutable();

CGPathMoveToPoint(fpath, NULL, cp1.x, cp1.y);
CGPathAddCurveToPoint(fpath, NULL, cp2.x, cp2.y, cp3.x, cp3.y, cp4.x, cp4.y);
keyFrameAnimation.path = fpath;
[testView.layer addAnimation:keyFrameAnimation forKey:@"pos"];
CFRelease(fpath);

哪个输出:

http://glassofcocoa.com/code/AnimationTest.mp4

您在数组中的一个点可能是起始位置?

【讨论】:

以上是关于CALayer 动画还原的主要内容,如果未能解决你的问题,请参考以下文章

动画 CALayer

CALayer.opacity 在 CATransaction 内没有动画

动画CALayer的安全方法

图像更改 CALayer 核心动画

为啥动画自定义 CALayer 属性会导致其他属性在动画期间为零?

CALayer 不透明度动画有效,但边界动画无效