从actionForLayer返回NSNull:forKey

时间:2010-05-17 22:12:31

标签: objective-c iphone xcode delegates calayer

如果我实施CALayer委托方法actionForLayer:forKey,我可以返回[NSNull null]以强制CALayer不动画任何更改。遗憾的是,[NSNull null]未实现CAAction委托,XCode会发出以下警告:

  

警告:类'NSNull'未实现'CAAction'协议

以下是方法代码:

- (id<CAAction>)actionForLayer:(CALayer *)theLayer
                        forKey:(NSString *)theKey {
 //This disables the animations when moving things around
 //Also, don't animate the selection box. It was doing weird things
 if(undoGroupStarted || theLayer == self.selectionBox) {
  return [NSNull null];
 } else {
  return nil;
 }
}

我做错了吗?返回[NSNull null]不良行为?如果是这样,那么我在这里尝试做什么的另一种方式是什么?如果没有,我如何让编译器满意?

2 个答案:

答案 0 :(得分:2)

“CoreAnimation编程指南”部分Defined Search Pattern for Action Keys解决了这个问题。他们CALayer委托可以返回nil来指定它不处理该操作,但搜索应该继续。它还可以返回[NSNull null]以指定不应处理该操作(即搜索应该停止)。

CALayer标题中,您会看到有关如何处理此问题的详细信息:

  

如果这些步骤中的任何一个导致非零动作对象,则   以下步骤将被忽略。如果最终结果是一个实例   NSNull,它被转换为“nil”。

为了使编译器接受这个,你可以简单地转换:

return (id <CAAction>)[NSNull null]; // Prevent the action from animating

答案 1 :(得分:-1)

根据Apple的CAAction文档判断,实现CAAction协议的唯一内置类是CAAnimation(当然还有它的子类)。编译器期望一个实现CAAction的返回值,所以是的,返回[NSNull null]将不起作用。您是否真的需要使用此委托方法,而不是使用[layer removeAllAnimations][layer removeAnimationForKey:]从图层中删除动画?

这看起来很浪费,但是如果你必须使用委托方法,也许你可以返回一个“空白”动画对象:

return [CAAnimation animation];

此外,您是否需要永久禁用此动画,或仅在特定情况下?如果您不需要永久覆盖动画,则可以使用CATransaction为各个方法调用禁用动画,如Core Animation Programming Guide中所述。