2012-02-20 3 views
0

Voici ma section de code ci-dessous, je souhaite mettre en œuvre une animation sur l'opacité pour montrer un effet de souffle sur un bouton.CAKeyFrameAnimation échoue sans aucune indication

NSString* kAnimation = @"animation"; 
NSString* kBreath = @"breath"; 
NSString* kHide = @"hide"; 
NSString* kOpacity = @"opacity"; 

- (void) breathAnimation { 

     ................ 

     CAKeyframeAnimation *darkblueBreathAnimation = [CAKeyframeAnimation animationWithKeyPath:kOpacity]; 

     NSArray *darkblueOpacityValues = [NSArray arrayWithObjects:[NSNumber numberWithFloat:1.0f], 
             [NSNumber numberWithFloat:0.0f], 
             [NSNumber numberWithFloat:1.0f], 
             nil]; 

     NSArray *darkblueOpacityTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f], 
             [NSNumber numberWithFloat:0.5f], 
             [NSNumber numberWithFloat:1.0f], 
             nil]; 

     [darkblueBreathAnimation setValues:darkblueOpacityValues]; 

     [darkblueBreathAnimation setKeyTimes:darkblueOpacityTimes]; 

     [darkblueBreathAnimation setDuration:1.0f]; 


     [darkblueBreathAnimation setRepeatCount:2]; 

     [darkblueBreathAnimation setFillMode:kCAFillModeRemoved]; 

     [darkblueBreathAnimation setCalculationMode:kCAAnimationLinear]; 

     [darkblueBreathAnimation setRemovedOnCompletion:YES]; 

     [darkblueBreathAnimation setDelegate:self]; 

     [darkBlueLayer_ addAnimation:darkblueBreathAnimation forKey:kBreath]; 

     CAKeyframeAnimation *lightblueBreathAnimation = [CAKeyframeAnimation animationWithKeyPath:kOpacity]; 

     NSArray *lightblueOpacityValues = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f], 
             [NSNumber numberWithFloat:1.0f], 
             [NSNumber numberWithFloat:0.0f], 
             nil]; 

     NSArray *lightblueOpacityTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f], 
             [NSNumber numberWithFloat:0.5f], 
             [NSNumber numberWithFloat:1.0f], 
             nil]; 

     [lightblueBreathAnimation setValues:lightblueOpacityValues]; 

     [lightblueBreathAnimation setKeyTimes:lightblueOpacityTimes]; 

     [lightblueBreathAnimation setDuration:1.0f]; 

     [lightblueBreathAnimation setRepeatCount:2]; 

     [lightblueBreathAnimation setFillMode:kCAFillModeRemoved]; 

     [lightblueBreathAnimation setCalculationMode:kCAAnimationLinear]; 

     [lightblueBreathAnimation setRemovedOnCompletion:YES]; 

     [lightblueBreathAnimation setDelegate:self]; 

     [lightblueBreathAnimation setValue:kBreath forKey:kAnimation]; 

     [lightBlueLayer_ addAnimation:lightblueBreathAnimation forKey:kBreath]; 

    ................... 

} 

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 

    NSString* value = (NSString*)[anim valueForKey:kAnimation]; 

    NSLog(@"Roby: value = %@", value); 

    if ([[anim valueForKey:kAnimation] isEqualToString:kHide]) { 

    //TODO 

    } else if ([[anim valueForKey:kAnimation] isEqualToString:kBreath]) { 

    [self removeBreathAnimationLayers]; 

    } 
} 

En fait, j'ai besoin de connaître l'arrêt de l'animation de souffle pour enlever les deux CALayer. Mais, j'ai le drapeau est NON dans animationDidStop(), il indique que l'animation n'est pas complète correctement, et aucune animation de souffle montré. Ensuite, j'ai essayé de ne pas appeler [self removeBreathAnimationLayers] pour supprimer les deux CALayer, l'animation fonctionne bien.

Est-ce que quelqu'un a des suggestions sur ce problème? J'ai vraiment besoin de savoir que l'animation s'arrête avec succès pour faire autre chose.

Appréciez pour votre réponse. Merci beaucoup!

-Roby

Répondre

0

J'obtenu la façon de résoudre ce problème en ajoutant [CATransaction commencer] et [CATransaction commettras] au début et à la fin de la section d'animation.

Ensuite, le code est comme ci-dessous:

- (void) breathAnimation { 

................ 
[CATransaction begin]; 

CAKeyframeAnimation *darkblueBreathAnimation = [CAKeyframeAnimation animationWithKeyPath:kOpacity]; 

NSArray *darkblueOpacityValues = [NSArray arrayWithObjects:[NSNumber numberWithFloat:1.0f], 
            [NSNumber numberWithFloat:0.0f], 
            [NSNumber numberWithFloat:1.0f], 
            nil]; 

NSArray *darkblueOpacityTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f], 
            [NSNumber numberWithFloat:0.5f], 
            [NSNumber numberWithFloat:1.0f], 
            nil]; 

[darkblueBreathAnimation setValues:darkblueOpacityValues]; 

[darkblueBreathAnimation setKeyTimes:darkblueOpacityTimes]; 

[darkblueBreathAnimation setDuration:1.0f]; 

[darkblueBreathAnimation setRepeatCount:2]; 

[darkblueBreathAnimation setFillMode:kCAFillModeRemoved]; 

[darkblueBreathAnimation setCalculationMode:kCAAnimationLinear]; 

[darkblueBreathAnimation setRemovedOnCompletion:YES]; 

[darkblueBreathAnimation setDelegate:self]; 

[darkBlueLayer_ addAnimation:darkblueBreathAnimation forKey:kBreath]; 

CAKeyframeAnimation *lightblueBreathAnimation = [CAKeyframeAnimation animationWithKeyPath:kOpacity]; 

NSArray *lightblueOpacityValues = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f], 
            [NSNumber numberWithFloat:1.0f], 
            [NSNumber numberWithFloat:0.0f], 
            nil]; 

NSArray *lightblueOpacityTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f], 
            [NSNumber numberWithFloat:0.5f], 
            [NSNumber numberWithFloat:1.0f], 
            nil]; 

[lightblueBreathAnimation setValues:lightblueOpacityValues]; 

[lightblueBreathAnimation setKeyTimes:lightblueOpacityTimes]; 

[lightblueBreathAnimation setDuration:1.0f]; 

[lightblueBreathAnimation setRepeatCount:2]; 

[lightblueBreathAnimation setFillMode:kCAFillModeRemoved]; 

[lightblueBreathAnimation setCalculationMode:kCAAnimationLinear]; 

[lightblueBreathAnimation setRemovedOnCompletion:YES]; 

[lightblueBreathAnimation setDelegate:self]; 

[lightblueBreathAnimation setValue:kBreath forKey:kAnimation]; 

[lightBlueLayer_ addAnimation:lightblueBreathAnimation forKey:kBreath]; 

[CATransaction commit]; 

................... 

} 

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 

NSString* value = (NSString*)[anim valueForKey:kAnimation]; 

NSLog(@"Roby: value = %@", value); 

if ([[anim valueForKey:kAnimation] isEqualToString:kHide]) { 

//TODO 

} else if ([[anim valueForKey:kAnimation] isEqualToString:kBreath]) { 

[self removeBreathAnimationLayers]; 

} 
} 

Je suis un débutant sur l'animation de base, souhaite que cela aiderait quelqu'un qui dirige cette question.

-Roby

Questions connexes