Ios CAKeyframeAnimation未按预期更改位置

Ios CAKeyframeAnimation未按预期更改位置,ios,objective-c,layer,cakeyframeanimation,Ios,Objective C,Layer,Cakeyframeanimation,我想在我的UIView层中添加一个入口动画,该动画左移+淡入,结尾有轻微的反弹。我为动画指定了一个值数组。值,但当动画运行时,它似乎总是跳过第三个值 它显示为左移然后右移,而不是反弹效果所需的左、右、左移 以下是迄今为止的代码: CAKeyframeAnimation *leftShift = [CAKeyframeAnimation animationWithKeyPath:@"position.x"]; leftShift.duration = 0.5; NSArray

我想在我的UIView层中添加一个入口动画,该动画左移+淡入,结尾有轻微的反弹。我为
动画指定了一个值数组。值
,但当动画运行时,它似乎总是跳过第三个值

它显示为左移然后右移,而不是反弹效果所需的左、右、左移

以下是迄今为止的代码:

 CAKeyframeAnimation *leftShift = [CAKeyframeAnimation animationWithKeyPath:@"position.x"];
leftShift.duration = 0.5;
NSArray *viewPositionValues = @[
    @(myView.layer.position.x),
    @(myView.layer.position.x - 22),
    @(myView.layer.position.x - 18),
    @(myView.layer.position.x - 20)
];
leftShift.values = viewPositionValues;
leftShift.keyTimes = @[ @0, @.5, @.75, @1];
myView.center = CGPointMake(myView.layer.position.x - 20, myView.layer.position.y);

CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.fromValue = @0;
myView.layer.opacity = 1;
opacityAnimation.duration = 0.25;

CAAnimationGroup *entranceAnimation = [CAAnimationGroup new];
entranceAnimation.animations = @[ leftShift, opacityAnimation ];
entranceAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
entranceAnimation.fillMode = kCAFillModeForwards;
[CATransaction begin];
[CATransaction setCompletionBlock:completion];
[myView.layer addAnimation:entranceAnimation forKey:kSpeedMenuEntranceAnimationKey];
_speedMenuView.hidden = NO;
[CATransaction commit];

**编辑:有趣的是,为leftShift.keyTimes中指定的时间戳之间的每次转换添加计时函数解决了这个问题。

问题在于您没有为动画组指定持续时间。因此,它具有默认的
0.25
秒持续时间,并且该持续时间不足以使
0.5
的关键帧动画持续时间完全播放

因此,给动画组足够长的持续时间将解决看不到整个关键帧动画的问题。另一方面,我建议您以完全不同的方式进行此操作,并使用UIKit dynamics或弹簧动画来实现标准的反弹效果,而不是尝试从头开始“构建”反弹