UIView のアニメーションを連続実行する : Objective-C プログラミング

PROGRAM


UIView のアニメーションを連続実行する

UIView では beginanimations:context: メソッドを使用して、アニメーションを実行できるようになっています。

そのアニメーションで、あるアニメーションを実行した後で次のアニメーションを実行したいような場合は、最初のアニメーションの中で setanimationDidStopSelector: メソッドを使用してセレクタを登録することで、別のアニメーションを連続実行することができます。

 

たとえば最初のアニメーションで、次のようにアニメーションを実行し終えた後に実行すべきセレクタと、そのセレクタを所有しているインスタンスを指定します。

// まずは通常通り、アニメーションの開始を宣言します。

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:1.0];

 

// アニメーションを終えた後に実行するセレクタと、そのセレクタの所有者を登録します。

[UIView setAnimationDelegate:self];

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

 

// 何かアニメーションに関する変化を設定します。

aView.alpha = 0.0;

 

// アニメーションを決定します。

[UIView commitAnimations];

これで beginAnimations:context: から commitAnimations までのアニメーションが実行されます。

アニメーションが実行されると、setAnimationDelegate: で設定したインスタンスが持つ、setAnimationDidStopSelector: で指定したセレクタが自動的に呼び出されるので、そのメソッド内でまた別のアニメーションをすれば、連続して別のアニメーションを実行することができます。

 

なお、setAnimationDidStopSelector: メソッドに指定するセレクタは、次のような形式である必要があります。

// setAnimationDidstopSelector: で登録可能なセレクターの種類

- (void)animationDidStop:(NSString*)animationID finished:(NSNumber*)finished context:(void*)context;

最初の animationID は、beginAnimations:context: の最初の引数で指定したアニメーション ID 文字列です。

続く finished では BOOL 型の値を保持した NSNumber 型の値が渡されてきて、この値によってアニメーションが停止される前に完了したかどうかが判るらしいのですが、どういうときに NO となるのか、よくわかりませんでした。

最後の context は、beginAnimations:context: の 2 番目の引数で指定した値が渡されます。これを活用すれば、それぞれ毎に続きのアニメーションを実行することができると思います。

 

他にも、setAnimationRepeatCount: によって実行回数を指定したり、setAnimationDuration: によってアニメーション開始のタイミングを遅らせることもできるので、こういった機能を活用すれば、柔軟にアニメーションを組み立てて行くことができそうです。

ちなみに、アニメーションの開始を遅らせた場合などで、アニメーションの開始に合わせて何かを実行したい場合には setAnimationWillStartSelector: メソッドで "- (void)animationDidStart:(NSString*)animationID context:(void*)context" 形式のセレクタを登録します。

[ もどる ]