如何在Core Animation中为onOrderOut使用自定义动画?

Lem*_*ing 8 cocoa core-animation objective-c

Core Animation通过在基于CALayer的类中实现actionForKey方法来允许自定义动画:

- (id<CAAction>)actionForKey:(NSString *)key {
    // Custom animations
    return [super actionForKey:key];
}
Run Code Online (Sandbox Code Playgroud)

然后我可以创建一个动画并将其返回给onOrderIn动作(即将图层添加到另一个图层时).这很好用.如果我执行相同操作onOrderOut(即从超级图层中删除图层),则会忽略返回的动画,而是应用默认动画.

我的目标是在(onOrderIn)和out(onOrderOut)中缩放图层:

- (id<CAAction>)actionForKey:(NSString *)key {

    if ([key isEqualToString:@"onOrderIn"] || [key isEqualToString:@"onOrderOut"]) {
        CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
        a.duration = 0.25;
        a.removedOnCompletion = NO;
        a.fillMode = kCAFillModeBoth;

        if ([key isEqualToString:@"onOrderIn"]) {
            a.fromValue = [NSNumber numberWithFloat:0.0];
            a.toValue = [NSNumber numberWithFloat:1.0];
        } else {
            a.fromValue = [NSNumber numberWithFloat:1.0];
            a.toValue = [NSNumber numberWithFloat:0.0];
        }

        return a;
    }

    return [super actionForKey:key];
}
Run Code Online (Sandbox Code Playgroud)

放大作品,缩小不会.而是使用默认的淡出动画.

代码可能包含一些拼写错误,因为我在另一台机器上输入了这个.

有人可以帮忙吗?

tjw*_*tjw 4

引用quartz-dev 邮件列表上的 John Harper 的话:

\n
\n

当动画应该运行时,\n为\nonOrderOut 键\xe2\x80\x94 返回任何动画存在一个根本问题,该层\n不再位于树中,因此\n没有效果。所以 onOrderOut 对于触发动画来说没有用处;当从树中删除层时,\n它可能有助于运行其他代码。

\n

我为此找到的最佳解决方案\n(假设父级的默认淡入淡出过渡\n不是您想要的,\n这通常不是您想要的)是添加自定义\动画来应用删除效果\n您然后,在 didStop\nanimation 委托中,实际删除\n该层。使用委托属性设置\n和\nfillMode=forwards、\nremovedOnCompletion=NO 创建一组动画通常很方便,这样您就可以\n删除动画末尾的图层,而无需\n该图层在其正常状态下仍可见。

\n
\n

如果你做了很多这样的情况,那么很容易编写一个通用的超类来启动动画,将动画委托设置为该类并实现 +animationDidStop:来删除未启用动画的图层。这恢复了 CoreAnimation 的即发即忘性质,您希望在默认实现中具有这种性质。

\n