我正在尝试创建自定义加载动画。动画由两部分组成。首先,向外绘制(动画)5行。线条完成绘制后,它们会逐渐消失并重新开始循环。为了使用两个动画获得此顺序行为,我使用两个CABasicAnimations
,两个都具有相同的委托。在委托方法animationDidStop:
中,我调度到正确的动画(动画2,如果动画1刚刚完成,反之亦然)。以下是相关代码:
-(void)startAnimating{//this method launches the line growing animation
self.hidden = NO;
BOOL delegateSet = NO;
animationPhase = 1;
for(CAShapeLayer * pathLayer in _lines){
[pathLayer removeAllAnimations];
pathLayer.strokeColor = _strokeColor.CGColor;
CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
pathAnimation.duration = .95;
pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
pathAnimation.toValue = [NSNumber numberWithFloat:1.0f];
if(!delegateSet){//just set one delegate
pathAnimation.delegate = self;
delegateSet = YES;
}
[pathLayer addAnimation:pathAnimation forKey:@"strokeEnd"];
}
}
//this delegate method dispatches the next animation
- (void) animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
if(animationPhase == 1)[self fadeLines];
else if(animationPhase == 2)[self startAnimating];
}
-(void)fadeLines{//this method launches the fading animation
self.hidden = NO;
BOOL delegateSet = NO;
animationPhase = 2;
for(CAShapeLayer * pathLayer in _lines){
[pathLayer removeAllAnimations];
CABasicAnimation *strokeAnim = [CABasicAnimation animationWithKeyPath:@"strokeColor"];
strokeAnim.fromValue = (id) pathLayer.strokeColor;
strokeAnim.toValue = (id) [UIColor clearColor].CGColor;
strokeAnim.duration = .2;
if(!delegateSet){//just set one delegate
strokeAnim.delegate = self;
delegateSet = YES;
}
[pathLayer addAnimation:strokeAnim forKey:@"animateStrokeColor"];
pathLayer.strokeColor = [UIColor clearColor].CGColor;
}
}
所以当它在它自己运行时(而不是在后台完成其他事情的时候),这一切都很有效。但是当我将它用作加载动画时(其他事情在后台完成),会执行第一个初始增长动画,但永远不会调用animationDidStop:
。
我尝试使用带有完成块的事务而不是使用委托模式,但我遇到了同样的问题。我无法在适当的beginTimes中使用CAAnimationGroup
,因为我需要动画循环播放。
另外需要注意的是,如果我只是以高重复次数执行增长动画,一切正常。唯一的问题是两个动画的顺序循环。如果有人知道如何解决这个问题,或者知道以不同的方式顺序循环两个CAAnimations,我将非常感激。