Ich hatte ein Problem mit einer Reihe überlappender CATransition / CAAnimation-Sequenzen, die ich alle ausführen musste, um benutzerdefinierte Vorgänge auszuführen, wenn die Animationen gestoppt wurden, aber ich wollte nur einen Delegaten-Handler für animationDidStop.
Ich hatte jedoch ein Problem, es schien keine Möglichkeit zu geben, jede CATransition / CAAnimation im animationDidStop-Delegaten eindeutig zu identifizieren.
Ich habe dieses Problem über das Schlüssel- / Wertesystem gelöst, das im Rahmen von CAAnimation verfügbar gemacht wurde.
Wenn Sie Ihre Animation starten, verwenden Sie die setValue-Methode in CATransition / CAAnimation, um Ihre Bezeichner und Werte festzulegen, die beim Auslösen von animationDidStop verwendet werden sollen:
-(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];
}
In Ihrem animationDidStop-Delegaten:
- (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.
}
Der andere Aspekt ist, dass Sie den Status im Schlüsselwertpaarungssystem beibehalten können, anstatt ihn in Ihrer Delegatenklasse speichern zu müssen. Je weniger Code, desto besser.
Lesen Sie unbedingt die Apple-Referenz zur Codierung von Schlüsselwertpaaren .
Gibt es bessere Techniken für die CAAnimation / CATransition-Identifizierung im animationDidStop-Delegaten?
Danke, - Batgar
CAAnimation
‚s delegate
stark, so dass Sie es einstellen können müssen, um nil
zu vermeiden Zyklen zu behalten!