Objective c 设置CALayer阴影路径的动画

Objective c 设置CALayer阴影路径的动画,objective-c,core-animation,Objective C,Core Animation,我正在为CALayer设置阴影路径动画 框架大小调整正确,但阴影不缩放 相反,阴影从最终大小CGSize(20,20)开始,并在整个动画中保持不变,即使我将阴影路径设置为初始值 [CATransaction begin]; [CATransaction setAnimationDuration: 0]; [CATransaction setDisableActions: TRUE]; layer.frame = CGRectMake(0,0,10,10); layer.shado

我正在为
CALayer
设置阴影路径动画

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

相反,阴影从最终大小
CGSize(20,20)
开始,并在整个动画中保持不变,即使我将阴影路径设置为初始值

[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];

起初,小正方形带有阴影

按下按钮时,正方形和阴影一起变大

主要代码如下:

[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下载这个项目并运行它


这个问题对我来说太难了!:)

希望根据Weed的答案添加另一个答案。我接受了威德的答案,并试图把所有的东西都放在一个CATTransaction中,因为我想制作多个层的动画,并确保动画同时发生。如果你们需要的话,给你们。另外,我仍然不明白为什么在CATTransaction中必须使用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];

谢谢你的努力。你能告诉我为什么我的解决方案不起作用吗?为什么可以设置帧动画而不能设置阴影路径?阴影动画的要点是将
animationWithKeyPath
设置为
@“阴影路径”
。这意味着动画的对象是阴影路径。我也不知道这个机制,但是设置
animationWithKeyPath
对于制作动画非常重要。这样行吗?