2011-10-17 18 views
6

もう1つのCABasicAnimationを終了した後で実行するにはどうすればよいですか?言い換えれば順番に。私は2番目のアニメーションの時間を開始追加しました、しかし、第二のアニメーションが実行されますしないようです:CABasicAnimationを連続して実行しています

CABasicAnimation * appearance =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    appearance.duration = 0.5; 
    appearance.fromValue = [NSNumber numberWithFloat:0]; 
    appearance.toValue = [NSNumber numberWithFloat:340]; 
    appearance.repeatCount = 1; 
    appearance.fillMode = kCAFillModeForwards; 
    appearance.removedOnCompletion = NO; 
    [notif.layer addAnimation:appearance forKey:@"transform.translation.y"]; 



    CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    theAnimation.duration = 0.5; 
    theAnimation.fromValue = [NSNumber numberWithFloat:0]; 
    theAnimation.toValue = [NSNumber numberWithFloat:10]; 
    theAnimation.repeatCount = 3; 
    theAnimation.autoreverses = YES; 
    theAnimation.fillMode = kCAFillModeForwards; 
    theAnimation.removedOnCompletion = NO; 
    theAnimation.beginTime = appearance.beginTime + appearance.duration; 
    [notif.layer addAnimation:theAnimation forKey:@"transform.translation.y"]; 

任意のアイデアなぜですか?

答えて

15

更新コード、これは機能します!

第一アニメーション

CABasicAnimation * appearance =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    [appearance setValue:@"animation1" forKey:@"id"]; 
    appearance.delegate = self; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)]; 
    appearance.duration = 0.5; 
    appearance.fromValue = [NSNumber numberWithFloat:0]; 
    appearance.toValue = [NSNumber numberWithFloat:340]; 
    appearance.repeatCount = 1; 
    appearance.fillMode = kCAFillModeForwards; 
    appearance.removedOnCompletion = NO; 
    [notif.layer addAnimation:appearance forKey:@"transform.translation.y"]; 

第二アニメーション:

- (void)animationDidStop:(CAAnimation *)theAnimation2 finished:(BOOL)flag { 
    if([[theAnimation2 valueForKey:@"id"] isEqual:@"animation1"]) { 
    CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    theAnimation.duration = 0.5; 
    theAnimation.fromValue = [NSNumber numberWithFloat:0]; 
    theAnimation.toValue = [NSNumber numberWithFloat:10]; 
    theAnimation.repeatCount = 3; 
    theAnimation.autoreverses = YES; 
    theAnimation.fillMode = kCAFillModeForwards; 
    theAnimation.removedOnCompletion = NO; 
    theAnimation.beginTime = appearance.beginTime + appearance.duration; 
    [notif.layer addAnimation:theAnimation forKey:@"transform.translation.y"]; 
} 

}

これは第一1が終了した後、第二のアニメーションが起動する方法をです。

+0

動作しませんでした。..animationDidStopが無限に呼び出されました – adit

+0

両方のコードをコピーしましたか?彼らは同じではありません。 –

+0

ループがある場合は、2番目のアニメーションもアニメーションDidStopも呼び出すように、2番目のアニメーションのデリゲートを設定していないことを確認してください。 – isaac

1

最も簡単なことは、最初のアニメーションのデリゲートを設定し、そのオブジェクトに​​を実装することです。その方法では、2番目のアニメーションをタップします。

+0

ハズレが、これは動作しませんでした – adit

1

あなたのアニメーションがプランに従って実行されていない理由は、&コアアニメーションをコーディングした方法によるものです。コアアニメーションはすべてGPUで駆動されます。 CAは、アニマルを最適にレンダリングするために、いくつかの事柄をうまく処理します。

現代のグラフィックスカードの生の並列処理能力と、コアアニメーションがカード上のCALayerのコンテンツをキャッシュして、コードが常にそれを再描画する必要がないという点がもう一つの要素です。ところで、これは、iPhoneのUIが比較的控えめなハードウェアでは非常に高速な理由の一部です。レイヤーツリーがの別のスレッドにレンダリングされるため、Core Animationは自動的にマルチコアMacを利用できます。

最後の行はimpです。 CAは別のスレッドで実行されています(&メインスレッドではありません)。だからあなたの問題に戻ってきて、あなたは同じくアニメートしようとしているCAの2ブロックを持っていますtransform.translation.y両方同時に!これはどのように機能しますか?だから、これを解決する

、どちらかない - ように

誰かが提案し何
  1. は、最初のOSオーバーの後の最初のアニメーション化し、第二キック後の第2のアニメーションの遅延を置きます。
  2. または1つのブロックでアニメーション全体をやり直してみてください。

私はちょうどコアアニメーションの仕組みの背後にある理論&の理論を強調したいと思います。これが役立つことを願って...

0

最も簡単でクリーンな方法はCAAnimationGroupです。この答えを見てください - それは私を助けました。

Chaining Core Animation animations

+3

'CAAnimationGroup'は、連続アニメーションではなく、通常は複数のプロパティをアニメーション化するためのものです。 – Barry

関連する問題