У мене виникла проблема, коли у мене була серія перекриваються послідовностей CATransition / CAAnimation, які мені знадобилися для виконання спеціальних операцій, коли анімації зупинялися, але я хотів лише одного обробника делегата для animationDidStop.
Однак у мене виникла проблема, не з'явився спосіб однозначно визначити кожен CATransition / CAAnimation у делегата animationDidStop.
Я вирішив цю проблему за допомогою системи ключ / значення, яка виявилася як частина CAAnimation.
Коли ви запускаєте анімацію, використовуйте метод setValue на CATransition / CAAnimation, щоб встановити свої ідентифікатори та значення, які використовуватимуться при запуску 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.
}
Інший аспект цього полягає в тому, що він дозволяє зберігати стан у системі сполучення ключових значень, а не зберігати його у вашому класі делегата. Чим менше коду, тим краще.
Обов’язково ознайомтеся з посиланням Apple на кодування ключових значень пари .
Чи є кращі методи ідентифікації CAAnimation / CATransition у делегата animationDidStop?
Спасибі, - Батгар
CAAnimation
«s delegate
сильна, так що вам , можливо , доведеться встановити його , nil
щоб уникнути збереження циклів!