【问题标题】:Returning NSNull from actionForLayer:forKey从 actionForLayer:forKey 返回 NSNull
【发布时间】:2010-05-17 22:12:30
【问题描述】:

如果我实现 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] 不良行为?如果是这样,还有什么方法可以做我在这里尝试做的事情?如果没有,如何让编译器满意?

【问题讨论】:

    标签: objective-c iphone xcode delegates calayer


    【解决方案1】:

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

    CALayer 标头中,您将看到有关如何处理的更多详细信息:

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

    要让编译器接受这个,你可以简单地转换:

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

    【讨论】:

    • 是的,这消除了编译器警告。有些东西让我在施放 NSNull 时停下来……但显然不会造成任何问题,因为我一直在毫无问题地返回 NSNull。谢谢。
    【解决方案2】:

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

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

    return [CAAnimation animation];
    

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

    【讨论】:

    • 我只需要在特定情况下禁用动画,禁用的行为与十几层左右的行为完全相同。使用委托允许我在情况出现时切换他们的行为。我将尝试空白动画,看看它是否有效。我不认为 CATransaction 会起作用,但我会再看一遍。
    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多