6

私は iPhone でアプリケーションを作成しており、その中にいくつかの UIView とレイヤーがあります。CAKeyframeAnimation クラスを使用していくつかのアニメーションを実行していますが、アニメーションを連鎖させる必要があるため、UIView で animationDidStop メソッドをオーバーライドしました。

コールバックを適切に取得していますが、次のアニメーションを開始できるように、終了したアニメーションを見つける方法がわかりませんでした。コールバック関数へのパラメータのみが CAAnimation オブジェクトとブール値です。

クラスにプロパティを設定し、使用するさまざまなアニメーションに列挙型を使用することで、この問題を回避できます。ただし、CAKeyframeAnimation オブジェクトで設定して、コールバックで同じものを参照できるコールバックに組み込みの属性があるかどうかを知りたかっただけです。

どんな助けでも大歓迎です!

4

2 に答える 2

13

アニメーションの名前を指定して、デリゲート メソッドで読み取ることができます。

[animation setValue:"firstAnimation" forKey:@"name"];

...

- (void)animationDidStop:(CAAnimation*)animation finished:(BOOL)finished {
  if([[animation valueForKey:@"name"] isEqual:@"firstAnimation"] && finished) {
    ...
  }
}
于 2009-01-03T20:23:45.247 に答える
11

CAKeyframeAnimations を使用しているとのことですが、UIView プロパティ (origin、bounds、alpha など) の単純なアニメーションが必要な場合は、プロパティの変更を begin/commit ブロックでラップして指定できます。アニメーションの完了時に呼び出されるデリゲート メソッド。デリゲート メソッドが 3 つの引数を取る限り、好きなように呼び出すことができます。例えば:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:ANIMATIONDURATIONINSECONDS];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(yourAnimationHasFinished:finished:context:)];
// Change property or properties here
[UIView commitAnimations];

メソッドを引き起こします

- (void)yourAnimationHasFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context;

呼ばれること。これにより許可される任意の名前付けにより、異なるアニメーションの完了の処理を分離する手段が提供されます。単純なアニメーションにはこれを好みます。

CALayers と直接対話するより複雑なアニメーションを処理するために、animationDidStop:finished: デリゲート メソッドは終了したアニメーション オブジェクトを返します。複数のアニメーションのデリゲートである 1 つのインスタンスを作成する場合、animationDidStop:finished: メソッド内の switch ステートメントで使用するために、アニメーションの NSMutableDictionary と NSNumbers を作成できます。CAKeyframeAnimation を作成するときは、setObject:forKey: を使用して一致する番号に割り当ててから、objectForKey: を使用して完了メソッドでそのアニメーションに対応する番号を見つけ、それを switch ステートメントにフィードします。

于 2009-01-03T20:08:38.973 に答える