У меня возникла проблема, когда у меня была серия перекрывающихся последовательностей 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?
Спасибо, Батгар