CAAnimation代理不称为自定义加载动画

时间:2015-03-24 01:29:56

标签: ios objective-c core-animation loading

我正在尝试创建自定义加载动画。动画由两部分组成。首先,向外绘制(动画)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,我将非常感激。

0 个答案:

没有答案