Miałem problem polegający na tym, że miałem serię nakładających się sekwencji CATransition / CAAnimation, z których wszystkie potrzebowałem do wykonywania niestandardowych operacji po zatrzymaniu animacji, ale chciałem tylko jednego delegata obsługi dla animationDidStop.
Jednak miałem problem, wydaje się, że nie ma sposobu na unikalną identyfikację każdego przejścia CATransition / CAAnimation w delegacie AnimationDidStop.
Rozwiązałem ten problem za pomocą systemu klucza / wartości ujawnionego w ramach CAAnimation.
Po uruchomieniu animacji użyj metody setValue w CATransition / CAAnimation, aby ustawić swoje identyfikatory i wartości, które mają być używane podczas uruchamiania animacjiDidStop:
-(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];
}
W twojej animacji DidStop delegata:
- (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.
}
Innym aspektem tego jest to, że pozwala to na utrzymanie stanu w systemie parowania klucz-wartość zamiast konieczności przechowywania go w klasie delegatów. Im mniej kodu, tym lepiej.
Koniecznie zapoznaj się z odniesieniem firmy Apple na temat kodowania pary klucz-wartość .
Czy istnieją lepsze techniki identyfikacji przejścia CAAnimation / CAT w delegacie AnimationDidStop?
Dzięki, - Batgar
CAAnimation
to delegate
jest mocne, więc może być konieczne ustawienie go, nil
aby uniknąć zachowania cykli!