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" 形式のセレクタを登録します。
[ もどる ]