一連のCATransition / CAAnimationシーケンスが重複していて、アニメーションが停止したときにカスタム操作を実行する必要があるという問題がありましたが、animationDidStopのデリゲートハンドラは1つしか必要ではありませんでした。
ただし、問題がありました。animationDidStopデリゲート内の各CATransition / CAAnimationを一意に識別する方法がないようです。
CAAnimationの一部として公開されているキー/値システムを使用して、この問題を解決しました。
アニメーションを開始するときは、CATransition / CAAnimationのsetValueメソッドを使用して、animationDidStopの起動時に使用する識別子と値を設定します。
-(void)volumeControlFadeToOrange
{
CATransition* volumeControlAnimation = [CATransition animation];
[volumeControlAnimation setType:kCATransitionFade];
[volumeControlAnimation setSubtype:kCATransitionFromTop];
[volumeControlAnimation setDelegate:self];
[volumeControlLevel setBackgroundImage:[UIImage imageNamed:@"SpecialVolume1.png"] forState:UIControlStateNormal];
volumeControlLevel.enabled = true;
[volumeControlAnimation setDuration:0.7];
[volumeControlAnimation setValue:@"Special1" forKey:@"MyAnimationType"];
[[volumeControlLevel layer] addAnimation:volumeControlAnimation forKey:nil];
}
- (void)throbUp
{
doThrobUp = true;
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionFade];
[animation setSubtype:kCATransitionFromTop];
[animation setDelegate:self];
[hearingAidHalo setBackgroundImage:[UIImage imageNamed:@"m13_grayglow.png"] forState:UIControlStateNormal];
[animation setDuration:2.0];
[animation setValue:@"Throb" forKey:@"MyAnimationType"];
[[hearingAidHalo layer] addAnimation:animation forKey:nil];
}
animationDidStopデリゲートで:
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{
NSString* value = [theAnimation valueForKey:@"MyAnimationType"];
if ([value isEqualToString:@"Throb"])
{
//... Your code here ...
return;
}
if ([value isEqualToString:@"Special1"])
{
//... Your code here ...
return;
}
//Add any future keyed animation operations when the animations are stopped.
}
これのもう1つの側面は、デリゲートクラスに格納する代わりに、キーと値のペアリングシステムで状態を維持できることです。コードが少ないほど良いです。
キーと値のペアのコーディングに関するAppleリファレンスを必ずチェックしてください。
animationDidStopデリゲートでCAAnimation / CATransitionを識別するためのより良いテクニックはありますか?
ありがとう、-バトガー
CAAnimation
's delegate
は強いので、nil
保持サイクルを回避するように設定する必要があるかもしれないことに注意してください!