2012-02-20 9 views
0

以下、私のコードセクションを示します。不透明度のアニメーションを実装して、ボタンにブレス効果を表示したいと考えています。CAKeyFrameAnimationがヒントなしで失敗する

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]; 

    } 
} 

実際には、私は2つのCALayerを削除するために息のアニメーションの停止を知る必要があります。しかし、私はanimationDidStop()でフラグがNOになっていますが、アニメーションが正しく完了していないことを示し、アニメーションが表示されていません。 次に、私は[self removeBreathAnimationLayers]を呼び出して2つのCALayerを削除しようとしましたが、アニメーションはうまくいきます。

この問題に関するお問い合わせはありますか?私は本当にアニメーションが正常に停止することを知る必要があります。

ご返信いただきありがとうございます。どうもありがとう!

-Roby

答えて

0

私は、[開始CATransaction]と[コミットCATransaction]開始時およびアニメーションセクションの終了追加することによってこの問題を解決する方法を得ました。

はその後、コードは以下のようなものです:

- (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]; 

} 
} 

私はコアアニメーションの初心者だけど、これはこの問題に遭遇し、誰かを助けてほしいです。

-roby

関連する問題