我遇到了一个问题,我有一系列重叠的 CATransition/CAAnimation 序列,所有这些序列我都需要在动画停止时执行自定义操作,但我只想要一个动画DidStop 的委托(delegate)处理程序。
但是,我遇到了一个问题,似乎没有一种方法可以唯一标识animationDidStop 委托(delegate)中的每个 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委托(delegate)中:
- (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.
}
另一方面,它允许您在键值配对系统中保留状态,而不必将其存储在委托(delegate)类中。代码越少越好。
请务必查看 Apple Reference on Key Value Pair Coding .
animationDidStop 委托(delegate)中是否有更好的 CAAnimation/CATransition 识别技术?
谢谢, --巴特加尔
最佳答案
巴特加尔的技术太复杂了。为什么不利用 addAnimation 中的 forKey 参数呢?它就是为了这个目的而设计的。只需取出对 setValue 的调用并将键字符串移至 addAnimation 调用即可。例如:
[[hearingAidHalo layer] addAnimation:animation forKey:@"Throb"];
然后,在animationDidStop回调中,您可以执行以下操作:
if (theAnimation == [[hearingAidHalo layer] animationForKey:@"Throb"]) ...
关于iphone - 如何在animationDidStop委托(delegate)中识别CAAnimation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1255086/