8

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

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

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

我的目标是放大 ( onOrderIn) 和缩小 ( 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];
}

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

代码可能包含一些拼写错误,因为我是在另一台机器上输入的。

任何人都可以帮忙吗?

4

2 回答 2

4

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

为 onOrderOut 键返回任何动画存在一个根本问题——当动画应该运行时,该层不再在树中,所以它没有效果。所以 onOrderOut 对触发动画没有用处;当从树中删除层时,它可能对运行其他代码很有用。

我为此找到的最佳解决方案(假设父级上的默认淡入淡出过渡不是您想要的,通常不是)是添加自定义动画以应用您想要的移除效果,然后在 didStop 动画中委托,实际删除层。使用委托属性集和 fillMode=forwards, removedOnCompletion=NO 创建一组动画通常很方便,这样您就可以在动画结束时删除图层,而图层在正常状态下仍然可见.

如果你经常这样做,很容易编写一个通用的超类来启动动画,将动画委托设置为类并实现 +animationDidStop:以删除未启用动画的层。这恢复了 CoreAnimation 的即发即弃的特性,您希望在默认实现中出现这种特性。

于 2009-08-16T18:52:50.597 回答
0

您是否验证过您的方法是用keyas调用的,@"onOrderOut"并且您的方法正在返回正确的动画?

于 2008-10-28T22:17:38.360 回答