Ho avuto un problema in cui avevo una serie di sequenze CATransition / CAAnimation sovrapposte, tutte necessarie per eseguire operazioni personalizzate quando le animazioni si sono interrotte, ma volevo solo un gestore delegato per animationDidStop.
Tuttavia, ho avuto un problema, non sembrava esserci un modo per identificare in modo univoco ogni CATransition / CAAnimation nel delegato animationDidStop.
Ho risolto questo problema tramite il sistema chiave / valore esposto come parte di CAAnimation.
Quando avvii l'animazione, utilizza il metodo setValue su CATransition / CAAnimation per impostare gli identificatori e i valori da utilizzare quando viene attivato 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];
}
Nella tua animazioneDidStop delegato:
- (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.
}
L'altro aspetto di ciò è che consente di mantenere lo stato nel sistema di associazione dei valori chiave invece di doverlo archiviare nella classe delegato. Meno codice, meglio è.
Assicurati di controllare il riferimento Apple sulla codifica della coppia di valori chiave .
Esistono tecniche migliori per l'identificazione CAAnimation / CATransition nel delegato animationDidStop?
Grazie, Batgar
CAAnimation
's delegate
è forte, quindi potrebbe essere necessario impostarlo nil
per evitare di mantenere i cicli!