일련의 겹치는 CATransition / CAAnimation 시퀀스가있는 문제가있었습니다.이 시퀀스는 모두 애니메이션이 중지되었을 때 사용자 지정 작업을 수행해야했지만 animationDidStop에 대한 하나의 델리게이트 핸들러 만 원했습니다.
그러나 문제가 있었는데 animationDidStop 델리게이트에서 각 CATransition / CAAnimation을 고유하게 식별하는 방법이없는 것 같습니다.
CAAnimation의 일부로 노출 된 키 / 값 시스템을 통해이 문제를 해결했습니다.
애니메이션을 시작할 때 CATransition / CAAnimation에서 setValue 메서드를 사용하여 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.
}
이것의 다른 측면은 델리게이트 클래스에 저장하는 대신 키 값 페어링 시스템에서 상태를 유지할 수 있다는 것입니다. 코드가 적을수록 좋습니다.
Key Value Pair Coding에 대한 Apple Reference 를 확인하십시오 .
animationDidStop 델리게이트에서 CAAnimation / CATransition 식별을위한 더 나은 기술이 있습니까?
감사합니다. -Batgar
CAAnimation
's는 delegate
당신이 그것을 설정해야 할 수도 있으므로, 강한 nil
사이클을 유지 피하기 위해!