3

每次用户做某事时,我都会尝试将 CALayer 移动几个点。我将动画设置为相对缓慢地运行,但是当我在设置动画后设置图层的位置时,隐式动画似乎接管并快速执行动画。这基本上是我的代码的样子:

    CGPoint point = CGPointMake(layer.position.x + 30, layer.position.y + 30);
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    animation.fromValue = [NSValue valueWithCGPoint: layer.position];
    animation.toValue = [NSValue valueWithCGPoint: point];
    animation.duration = 4;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    [layer addAnimation:animation forKey:@"position"];
    layer.position = point;

我尝试删除layer.position = point导致第一个动画按预期运行的最后一行,但是当我第二次尝试运行动画时,图层跳回到我运行第一个动画之前的图层所在的位置。目前,我能够解决此问题的唯一方法是向实现的动画添加一个委托,animationDidStop并在动画完成后设置图层的点。但是查看很多其他人的示例代码,这不应该是必需的。有什么我做错了吗?

4

2 回答 2

0

你应该看看WWDC'11 session 421 - Core Animation Essentials,在 45:21 有一个类似的例子。

他们首先在图层上设置新值,创建动画然后将其添加到图层。您必须注意的一件事是fillMode属性,它应该是kCAFillModeBackwards

于 2014-07-07T14:13:17.383 回答
0

你不需要弄乱removedOnCompletionor fillMode。您看到的不正确位置不是由于隐式动画。您唯一没有做的就是在运行动画之前立即设置图层的新位置。您的问题是您在添加动画后设置了新位置。以下是 Swift 3 中函数式版本的外观:

let newPoint = CGPoint(x: layer.position.x + 30, y: layer.position.y + 30)

let animation = CABasicAnimation(keyPath: "position")
animation.fromValue = NSValue(cgPoint: layer.position)
animation.toValue = NSValue(cgPoint: newPoint)

layer.setValue(NSValue(cgPoint: newPoint), forKeyPath: "position")

layer.add(animation, forKey: nil)
于 2016-08-19T01:36:26.327 回答