1

これはまったくの初心者の質問です (申し訳ありません) が、あるアニメーションをコミットする方法と、それが終了したら別のアニメーションを開始する方法を考えていました。画像が x=0 から x=300 に移動したと想像してください。次に、同じ画像をもう一度アニメーション化しますが、今回は x=300 から x=330 に変更して、画面から消えます。

次のコードは、x=300 から x=330 までのアニメーションのみを実行し、x=0 から x=300 までのアニメーションをコミットしません。私は commitAnimation の概念を理解していないと確信していますが、これは明らかですが、2 つのアニメーションを連続して行うにはどうすればよいでしょうか?

画像をすぐに 330 に移動できることはわかっていますが、最初のアニメーション (x 0 - 300) を別のアニメーションと同期させる必要があるため、これは望ましくありません。

ここに私の(間違った)コードがあります:

[UIView beginAnimations:@"shadowMove" context:nil]; // Begin animation
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[imageView setFrame:CGRectOffset([imageView frame], 300, 0)]; 

[UIView commitAnimations]; // End animations


// Second Animation


[UIView beginAnimations:@"shadowMoveRestAway" context:nil]; // Begin animation
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[imageView setFrame:CGRectOffset([imageView frame], 330, 0)]; // Move imageView off screen

[UIView commitAnimations]; // End animations
4

1 に答える 1

8

デリゲート メソッドを使用する

[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

最初のアニメーションが終了したときに別のことを開始します。次にやりたいことを animationDidStop:finished:context メソッド内に入れます。iPhone はイベント ドリブン環境であるため、上記のような線形コードは各アニメーションをほぼ同時に開始するだけであることを思い出してください。

編集:

アニメーション デリゲートも設定する必要があることを追加するのを忘れていました。そうしないと、最初のイベントが停止したときにイベントを取得できません。以下を参照してください。

変更を加えたコードの完全なバージョンを次に示します。省略した animationDidStop デリゲートを使用しています。これは、この例では理解しやすく、問題がないためです。

[UIView beginAnimations:@"shadowMove" context:nil]; // Begin animation
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(myFirstAnimationDidStop)];
[imageView setFrame:CGRectOffset([imageView frame], 300, 0)]; 
[UIView commitAnimations]; // End animations

次に、次のような新しいメソッドが必要です。

-(void) myFirstAnimationDidStop {
// Second Animation

[UIView beginAnimations:@"shadowMoveRestAway" context:nil]; 
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[imageView setFrame:CGRectOffset([imageView frame], 330, 0)];
[UIView commitAnimations]; 
}

完全を期すために、インターフェイス (.h) ファイルに追加する必要があります。

-(void) myFirstAnimationDidStop;

@selector は簡単です。別のメソッドを指す方法にすぎません。この例でそれが明確になることを願っています。

于 2011-03-30T12:27:19.913 に答える