2008-10-28 77 views
8

核心动画允许自定义动画通过实现您的CALayer基于类的actionForKey方法:如何在Core Animation中使用onOrderOut的自定义动画?

- (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

quartz-dev mailing list引用约翰·哈珀:

有与 一个根本问题,通过关键的 动画应该运行的时间返回任何动画的 onOrderOut,层 不再在树,所以它没有 的影响。所以onOrderOut对于触发动画没有用 ;当从树中删除 图层时,它可能是 对于运行其他代码很有用。

我发现这个 的最佳解决方案(假设父默认淡出过渡 是不是你想要的, 它往往是不)是添加自定义动画 申请的去除效果 然后,在didStop 动画代理中,实际删除 这一层。这是很方便的 创建动画 与委托财产集合的一个组,并 在fillMode =前锋, removedOnCompletion = NO,这样就可以 在 动画与没有 层的可能性到底去除层仍然在其正常状态下显示在其 。

如果你做很多这样的情况下,很容易编写一个启动动画的通用超,将动画委托类和工具+ animationDidStop:去除层W/O动画启用。这恢复了CoreAnimation的Fire&For-Forgot特性,您希望在缺省实现中呈现CoreAnimation。

+0

啊,谢谢。我会测试这个,如果我再次需要它,意思是我们用Qt Jambi编写了一个完全不同版本的软件。 ;) – Lemming 2009-11-06 22:20:01

0

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

+0

是的。在实际的代码中,我首先用动作的名称调用NSLog,事实上,onOrderOut被请求。我还确保动画是创建并返回的,但仍然被忽略。 – Lemming 2008-10-31 15:23:23

相关问题