1. ホーム
  2. iphone

[解決済み] animationDidStopデリゲート内でCAAnimationを識別する方法とは?

2022-11-27 17:34:07

質問

私は、オーバーラップする一連のCATransition / CAAnimationシーケンスを持っていて、アニメーションが停止したときにカスタム処理を実行する必要があるのですが、animationDidStopのためのデリゲートハンドラは1つだけ欲しいという問題がありました。

しかし、問題がありました。animationDidStopデリゲートにおいて、それぞれのCATransition / CAAnimationを一意に識別する方法がないように思われたのです。

私は、CAAnimationの一部として公開されたキー/値システムによって、この問題を解決しました。

アニメーションを開始するとき、CATransition / CAAnimationのsetValueメソッドを使用して、identifierと値を設定し、animationDidStopが発生したときに使用するようにします。

-(void)volumeControlFadeToOrange
{   
    CATransition* volumeControlAnimation = [CATransition animation];
    [volumeControlAnimation setType:kCATransitionFade];
    [volumeControlAnimation setSubtype:kCATransitionFromTop];
    [volumeControlAnimation setDelegate:self];
    [volumeControlLevel setBackgroundImage:[UIImage imageNamed:@"SpecialVolume1.png"] forState:UIControlStateNormal];
    volumeControlLevel.enabled = true;
    [volumeControlAnimation setDuration:0.7];
    [volumeControlAnimation setValue:@"Special1" forKey:@"MyAnimationType"];
    [[volumeControlLevel layer] addAnimation:volumeControlAnimation forKey:nil];    
}

- (void)throbUp
{
    doThrobUp = true;

    CATransition *animation = [CATransition animation]; 
    [animation setType:kCATransitionFade];
    [animation setSubtype:kCATransitionFromTop];
    [animation setDelegate:self];
    [hearingAidHalo setBackgroundImage:[UIImage imageNamed:@"m13_grayglow.png"] forState:UIControlStateNormal];
    [animation setDuration:2.0];
    [animation setValue:@"Throb" forKey:@"MyAnimationType"];
    [[hearingAidHalo layer] addAnimation:animation forKey:nil];
}

animationDidStopデリゲートで。

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

    NSString* value = [theAnimation valueForKey:@"MyAnimationType"];
    if ([value isEqualToString:@"Throb"])
    {
       //... Your code here ...
       return;
    }


    if ([value isEqualToString:@"Special1"])
    {
       //... Your code here ...
       return;
    }

    //Add any future keyed animation operations when the animations are stopped.
 }

もう一つの側面は、デリゲートクラスに状態を保存する必要がなく、キーと値のペアリング方式で状態を保持できることです。コードが少なければ少ないほど良い。

を必ずチェックしてください。 Apple Reference on Key Value Pair Codingをご覧ください。 .

animationDidStopデリゲートでCAAnimation / CATransitionを識別するためのより良いテクニックはありますか?

ありがとうございます。 --Batgar

どのように解決するのですか?

Batgarのテクニックは複雑すぎる。なぜ addAnimation の forKey パラメータを利用しないのでしょうか。それはまさにこの目的のために意図されたものです。setValueの呼び出しを取り除き、キー文字列をaddAnimationの呼び出しに移動させるだけです。たとえば

[[hearingAidHalo layer] addAnimation:animation forKey:@"Throb"];

そして、animationDidStopコールバックで、次のようなことをします。

if (theAnimation == [[hearingAidHalo layer] animationForKey:@"Throb"]) ...