Вам необходимо установить конечную позицию. Если вы используете только анимацию fromValue и toValue, она вернется к исходной начальной точке. Анимация использует копию вида / слоя, когда он «проигрывает», а затем анимация покажет исходный вид / слой после его завершения.
Если вы не установите его явно, он, похоже, вернется назад, даже если вид / слой никогда не перемещались.
startPoint и endPoint - это CGPoints, а myView - это анимированный UIView.
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.duration = .3;
animation.fromValue = [NSValue valueWithCGPoint:startPoint];
animation.toValue = [NSValue valueWithCGPoint:endPoint];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[myView.layer addAnimation:animation forKey:@"position"];
myView.layer.position = endPoint; // Must set end position, otherwise it jumps back