如果我实施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]
不良行为?如果是这样,那么我在这里尝试做什么的另一种方式是什么?如果没有,我如何让编译器满意?
答案 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中所述。