顺序CAKeyFrameAnimations在屏幕上消失

时间:2013-03-13 22:42:41

标签: ios core-animation caanimation cakeyframeanimation cashapelayer

编辑:CAAnimationGroup的附加代码,动画顺序绘制,但我仍然遇到firstAnimationsecondAnimation启动后消失的问题,我注意到CAAnimationGroup 3}}对于CAKeyFrameAnimation,它说:

  

动画属性中动画的removedOnCompletion属性目前被忽略。

如何解决这个问题?


我正在尝试为同一图层上的多个firstAnimation对象设置动画,这样当secondAnimation完成时,当secondAnimation被启动时,它绘制的路径仍保留在屏幕上,所以结束结果是在屏幕上由两个对象的路径组成的图片。

目前,如果我将两个动画对象(按顺序)放在同一个方法中并调用它,则只在屏幕上绘制firstAnimation。如果我将它们拆分并按顺序调用它们,secondAnimation将被绘制到屏幕上,然后在CAAnimationGroup启动时消失。动画本身就完全符合预期。

我已经尝试过寻找CAShapeLayer *pathLayer = [CAShapeLayer layer]; pathLayer.frame = self.animationLayer.bounds; pathLayer.bounds = pathRect; pathLayer.geometryFlipped = YES; pathLayer.strokeColor = [[UIColor blackColor] CGColor]; pathLayer.fillColor = nil; pathLayer.lineWidth = 10.0f; pathLayer.lineJoin = kCALineJoinBevel; CAKeyframeAnimation *firstAnimation = [CAKeyframeAnimation animationWithKeyPath:@"path"]; firstAnimation.beginTime = 0.0; firstAnimation.duration = 4.0; firstAnimation.removedOnCompletion = NO; //Is being ignored by CAAnimationGroup firstAnimation.fillMode = kCAFillModeForwards; firstAnimation.values = [NSArray arrayWithObjects: (id)path0.CGPath,(id)path1.CGPath, (id)path2.CGPath,(id)path3.CGPath, (id)path4.CGPath,(id)path5.CGPath,nil]; firstAnimation.keyTimes = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:0.2], [NSNumber numberWithFloat:0.21], [NSNumber numberWithFloat:0.22], [NSNumber numberWithFloat:0.63], [NSNumber numberWithFloat:1.0], nil]; CAKeyframeAnimation *secondAnimation = [CAKeyframeAnimation animationWithKeyPath:@"path"]; secondAnimation.beginTime = 4.0; //This should come directly after firstAnimation secondAnimation.duration = 3.0; secondAnimation.removedOnCompletion = NO; //Is being ignored by CAAnimationGroup secondAnimation.fillMode = kCAFillModeForwards; secondAnimation.values = [NSArray arrayWithObjects: (id)path00.CGPath,(id)path01.CGPath, (id)path02.CGPath,nil]; secondAnimation.keyTimes = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:0.8], [NSNumber numberWithFloat:1.0],nil]; CAAnimationGroup *group = [CAAnimationGroup animation]; group.animations = [NSArray arrayWithObjects:firstAnimation,secondAnimation,nil]; group.duration = 7.0; //The total time of the animations, don't know if redundant group.delegate = self; [self.pathLayer addAnimation:group forKey:@"path"]; 个例子,因为似乎是我正在寻找的东西,但从我见过的几个例子来看,它并不是很明显我正在发生什么,或者如何产生我正在寻找的效果,是否有人能告诉我如何顺序绘制动画并将结果保留在屏幕上?

这是我的图层,我的两个动画和我的小组:

{{1}}

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了一个试探性的黑客来解决我的问题,Till的评论对于纯序列化很有用,但动画一直在消失,所以这对我的情况根本不起作用。

我使用的hack是为每个动画创建单独的层,而不是将两个动画放在单个CAShapeLayer实例上,然后指定根据时间控制器对两个动画durationkeyTime以获得1)动画之间正确的时间顺序和2)每个动画中的时间是正确的。

通过使用单独的图层,removedOnComplete = NO再次起作用,因为我没有使用CAAnimationGroup所以我的动画是持久性的,这是我在我的应用中真正需要的东西。

我不会立即接受这个答案,因为这似乎是一种低调的方式来做一些在iOS上应该更直观的事情。