如果我实现了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]是不好的行为吗?如果是这样的话,我在这里想做的另一种方法是什么?如果不是,我如何使编译器高兴?
发布于 2010-05-22 18:07:46
"CoreAnimation编程指南“一节为操作键定义搜索模式介绍了这一点。他们可以返回CALayer委托来指定它不处理操作,但是搜索应该继续。它还可以返回[NSNull null]来指定不应该处理操作(也就是说,搜索应该停止)。
在CALayer头中,您将看到更多关于如何处理这个问题的详细信息:
如果这些步骤中的任何一个导致非零操作对象,则忽略下列步骤。如果最后的结果是NSNull的一个实例,则将其转换为“`nil”。
要使编译器接受这一点,只需强制转换:
return (id <CAAction>)[NSNull null]; // Prevent the action from animating发布于 2010-05-21 01:39:27
从苹果的CAAction文档来看,实现CAAction协议的唯一内置类是CAAnimation (当然还有它的子类)。编译器期待一个实现CAAction的返回值,所以是的,返回NSNull null将无法工作。您真的需要使用此委托方法,而不是使用[layer removeAllAnimations]或[layer removeAnimationForKey:]从图层中删除动画吗?
这看起来很浪费,但是如果您一定要使用委托方法,也许您可以返回一个“空白”动画对象:
return [CAAnimation animation];此外,您需要永久禁用此动画,还是仅在特定情况下?如果您不需要永久重写动画,您可以使用CATransaction来禁用单个方法调用的动画,如核心动画编程指南中所记录的那样。
https://stackoverflow.com/questions/2853255
复制相似问题