2012-08-12 102 views
6

我为CALayer设置阴影路径的动画。动画CALayer阴影路径

框架调整正确,但阴影不缩放。

反而影子开始在最终大小CGSize(20,20)和整个动画持有,即使我的shadowPath设置为初始值

[CATransaction begin]; 
[CATransaction setAnimationDuration: 0]; 
[CATransaction setDisableActions: TRUE]; 
    layer.frame = CGRectMake(0,0,10,10); 
    layer.shadowPath = [UIBezierPath bezierPathWithRect:layer.bounds].CGPath; 
[CATransaction commit]; 

[CATransaction begin]; 

    [CATransaction setValue:[NSNumber numberWithFloat:10] forKey:kCATransactionAnimationDuration]; 
    layer.frame = CGRectMake(0,0,20,20); 
    layer.shadowPath = [UIBezierPath bezierPathWithRect:tile.bounds].CGPath; 

[CATransaction commit]; 

回答

9

起初,小方与阴影。

ss

当按下的按钮,广场和阴影做大在一起。

ss

主要的代码如下:

[CATransaction begin]; 
[CATransaction setAnimationDuration:5.0]; 
CAMediaTimingFunction *timing = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
[CATransaction setAnimationTimingFunction:timing]; 
layer.frame = CGRectMake(0,0,100,100); 
[CATransaction commit];  

CABasicAnimation *shadowAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"]; 
shadowAnimation.duration = 5.0; 
shadowAnimation.fromValue = (id)[UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 50, 50)].CGPath; 
shadowAnimation.toValue = (id)[UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)].CGPath; 
[layer addAnimation:shadowAnimation forKey:@"shadow"]; 

您可以下载从GitHub这个项目,只是运行它。

https://github.com/weed/p120812_CALayerShadowTest

这个问题问得非常难受! :)

+0

感谢您的努力。你能告诉我为什么我的解决方案不起作用吗?为什么你可以为框架设置动画而不是阴影路径? – prostock 2012-08-12 05:34:19

+0

影子动画的要点是将'animationWithKeyPath'设置为'@“shadowPath”'。这意味着动画的对象是'shadowPath'。我也不知道这种机制,但设置'animationWithKeyPath'对于制作动画非常重要。这个可以吗 ? – weed 2012-08-12 05:47:56

3

想根据Weed的回答添加另一个答案。我采取了杂草的答案,并试图将所有内容放入CATransaction中,因为我想为多个图层制作动画并确保动画一起发生。如果你需要它的话,你们可以去。另外,我仍然不明白为什么你必须在CATransaction中使用fromValue和toValue。你为什么不能像做框架一样做其他属性呢?

[CATransaction begin]; 

[CATransaction setValue:[CAMediaTimingFunction 
    functionWithName:kCAMediaTimingFunctionEaseOut] 
    forKey:kCATransactionAnimationTimingFunction]; 

for (CALayer *layer in self.layers){ 
    CABasicAnimation *shadowAnimation = 
    [CABasicAnimation animationWithKeyPath:@"shadowPath"]; 

    shadowAnimation.fromValue = 
     (id)[UIBezierPath bezierPathWithRect:layer.bounds].CGPath; 
    shadowAnimation.timingFunction = 
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
    layer.frame = rectFinal; 
    shadowAnimation.toValue = 
     (id)[UIBezierPath bezierPathWithRect:layer.bounds].CGPath; 
    layer.shadowPath = 
     [UIBezierPath bezierPathWithRect:layer.bounds].CGPath; 
    [layer addAnimation:shadowAnimation forKey:nil]; 
}   
[CATransaction commit];