每次用户做某事时,我都试图将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
的动画添加委托,并在动画完成后设置图层的点。但是看看很多其他人的示例代码,这不应该是必需的。有什么我做错了吗?
答案 0 :(得分:0)
你应该看看WWDC'11会话421 - 核心动画要点,在45:21有一个类似你的例子。
他们首先在图层上设置新值,创建动画然后将其添加到图层。
您必须注意的一件事是fillMode
属性,它应该是kCAFillModeBackwards
。
答案 1 :(得分:0)
您无需弄乱removedOnCompletion
或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)