6

我正在 iPhone 中创建一个应用程序,其中有几个 UIView 和图层。我正在使用 CAKeyframeAnimation 类制作一些动画,并且由于必须链接动画,因此我已经覆盖了 UIView 中的 animationDidStop 方法。

我得到了正确的回调,但是我不知道如何找到结束的动画,以便我可以开始下一个。只有回调函数的参数是 CAAnimation 对象和布尔值。

我可以通过在类中设置一个属性并为我使用的各种动画使用枚举来解决这个问题。但是我只是想知道回调中是否有任何内置属性,我可以在 CAKeyframeAnimation 对象中设置这些属性,然后在回调中引用相同的属性。

任何帮助将不胜感激!

4

2 回答 2

13

您可以为动画指定名称并在您的委托方法中读取它。

[animation setValue:"firstAnimation" forKey:@"name"];

...

- (void)animationDidStop:(CAAnimation*)animation finished:(BOOL)finished {
  if([[animation valueForKey:@"name"] isEqual:@"firstAnimation"] && finished) {
    ...
  }
}
于 2009-01-03T20:23:45.247 回答
11

我知道您说您正在使用 CAKeyframeAnimations,但是如果您想要 UIView 属性(原点、边界、alpha 等)的简单动画,您可以将属性或属性的更改包装在开始/提交块中并指定动画完成时调用的委托方法。只要委托方法接受三个参数,您就可以随意调用它。例如:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:ANIMATIONDURATIONINSECONDS];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(yourAnimationHasFinished:finished:context:)];
// Change property or properties here
[UIView commitAnimations];

会导致方法

- (void)yourAnimationHasFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context;

被称为。这允许的任意命名将为您提供一种分离处理以完成不同动画的方法。对于简单的动画,我更喜欢这个。

为了处理直接与 CALayers 交互的更复杂的动画,animationDidStop:finished: 委托方法确实返回已完成的动画对象。如果您正在创建一个实例作为多个动画的委托,您可以创建动画和 NSNumbers 的 NSMutableDictionary 以在 animationDidStop:finished: 方法中的 switch 语句中使用。在创建 CAKeyframeAnimation 时,使用 setObject:forKey: 将其分配给其匹配编号,然后使用 objectForKey: 在完成方法中找到与该动画对应的编号,并将其输入到 switch 语句中。

于 2009-01-03T20:08:38.973 回答