首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从actionForLayer返回NSNull :forKey

从actionForLayer返回NSNull :forKey
EN

Stack Overflow用户
提问于 2010-05-17 22:12:30
回答 2查看 1.7K关注 0票数 1

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

警告:类'NSNull‘不能实现'CAAction’协议

以下是方法代码:

代码语言:javascript
复制
- (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]是不好的行为吗?如果是这样的话,我在这里想做的另一种方法是什么?如果不是,我如何使编译器高兴?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-22 18:07:46

"CoreAnimation编程指南“一节为操作键定义搜索模式介绍了这一点。他们可以返回CALayer委托来指定它不处理操作,但是搜索应该继续。它还可以返回[NSNull null]来指定不应该处理操作(也就是说,搜索应该停止)。

CALayer头中,您将看到更多关于如何处理这个问题的详细信息:

如果这些步骤中的任何一个导致非零操作对象,则忽略下列步骤。如果最后的结果是NSNull的一个实例,则将其转换为“`nil”。

要使编译器接受这一点,只需强制转换:

代码语言:javascript
复制
return (id <CAAction>)[NSNull null]; // Prevent the action from animating
票数 2
EN

Stack Overflow用户

发布于 2010-05-21 01:39:27

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

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

代码语言:javascript
复制
return [CAAnimation animation];

此外,您需要永久禁用此动画,还是仅在特定情况下?如果您不需要永久重写动画,您可以使用CATransaction来禁用单个方法调用的动画,如核心动画编程指南中所记录的那样。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2853255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档