CAKeyFrameAnimation表示层似乎没有改变

时间:2015-04-04 20:52:04

标签: ios core-animation calayer cakeyframeanimation

我使用CAKeyframeAnimation在一个圆形轨迹上移动CALayer。有时我需要停止动画并将动画移动到动画停止的位置。代码如下:

CAKeyframeAnimation* circlePathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
CGMutablePathRef circularPath = the circle path;

circlePathAnimation.path = circularPath;
circlePathAnimation.delegate = self;
circlePathAnimation.duration = 3.0f;
circlePathAnimation.repeatCount = 1;
circlePathAnimation.fillMode = kCAFillModeForwards;
circlePathAnimation.removedOnCompletion = NO;
circlePathAnimation.timingFunction = [CAMediaTimingFunction functionWithControlPoints:.43 :.78 :.69 :.99];
[circlePathAnimation setValue:layer forKey:@"animationLayer"];
[layer addAnimation:circlePathAnimation forKey:@"Rotation"];


- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    CALayer *layer = [anim valueForKey:@"animationLayer"];
    if (layer) {
        CALayer *presentationLayer = layer.presentationLayer;
        layer.position = presentationLayer.position;
    }
}

但是表示层的位置没有变化!我读到ios 8不再可靠了。那么还有其他方法可以找到动画层的当前位置吗?

1 个答案:

答案 0 :(得分:1)

我不知道表示层的position属性停止告诉你在iOS 8中你的图层的位置。这很有趣。使用表示层上的hitTest方法进行测试仍然有效,我刚刚在我写的一个应用程序上尝试过它。

暂停和恢复动画也仍然有效。

对于像圆形路径这样的简单路径,您可以检查动画的时间,然后使用trig计算位置。

对于更复杂的路径,您必须了解图层遍历的路径。随着时间的推移绘制单个三次或二次贝塞尔曲线是非常简单的,但是复杂的UIBezierPath / CGPath中混合了不同的形状将是一个难以理解的。