我知道一个CALayer的shadowPath只能使用显式动画进行动画制作,但是我仍然无法让它工作。我怀疑我没有正确通过toValue
- 据我所知这必须是id
,但该属性需要CGPathRef。将其存储在UIBezierPath
似乎不起作用。我使用下面的代码进行测试:动画CALayer的shadowPath属性
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
theAnimation.duration = 3.0;
theAnimation.toValue = [UIBezierPath bezierPathWithRect:CGRectMake(-10.0, -10.0, 50.0, 50.0)];
[self.view.layer addAnimation:theAnimation forKey:@"animateShadowPath"];
(我使用负值,以确保阴影延伸超过位于其顶部视图...层的masksToBounds
属性设置为NO
) 。
shadowPath的动画是如何实现的?
UPDATE
问题近解决。不幸的是,主要的问题是一个粗心的错误...
我犯的错误是将动画添加到视图控制器的根层,而不是我专用于阴影的图层。另外,@ pe8ter是正确的,因为toValue
需要是CGPathRef
转换为id
(很明显,当我之前尝试过,因为错误的层错误,我还没有动画)。该动画作品用下面的代码:
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
theAnimation.duration = 3.0;
theAnimation.toValue = (id)[UIBezierPath bezierPathWithRect:myRect].CGPath;
[controller.shadowLayer addAnimation:theAnimation forKey:@"shadowPath"];
我明白,这是很难从我提供的示例代码被发现。但希望它仍然可以用于类似情况的人们。
然而,当我尝试并添加行
controller.shadowLayer.shadowPath = [UIBezierPath bezierPathWithRect:myRect].CGPath;
动画停止工作,和阴影只是跳转到最终位置瞬间。 Docs说要使用与要更改的属性相同的键添加动画,以覆盖在设置属性值时创建的隐式动画,但shadowPath无法生成隐式动画...因此,如何获取新属性在之后留下动画?
对不起,没有帮助。我能想到的唯一选择是使用'CALayer'的委托来显式设置_after_动画。请参阅[本文](http://stackoverflow.com/questions/2559812/cabasicanimation-not-changing-its-position-property-after-animation-completes)。 – pe8ter 2011-05-08 20:06:32
@ pe8ter:太近了!我遵循这个伟大的建议,但在animationDidStop:截获动画并设置框架之前,原始shadowPath有一个非常轻微的闪光。太令人沮丧了。这可能是因为我必须遍历一小组视图控制器来为每个动画标识正确的图层,尽管我怀疑委托方法只是在已经将shadowPath设置为其原始价值。 – Stuart 2011-05-08 21:59:30
很难说你的代码出了什么问题。我嘲笑了一个小测试程序并尝试了两种方法;他们按预期工作,没有任何视觉伪影。 – pe8ter 2011-05-09 01:32:36