无法在 ios 中降低动画速度

unable to slow down animation speed in ios

我想在动画即将结束时放慢动画速度。
我正在检查这段代码。

[CATransaction begin];
CABasicAnimation *rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.byValue = [NSNumber numberWithFloat:20];
rotationAnimation.duration = 2;
rotationAnimation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
[CATransaction setCompletionBlock:^{
    imageView.transform = CGAffineTransformRotate(imageView.transform, DEGREES_TO_RADIANS(myAngle*32.72));
}];

[imageView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
[CATransaction commit];

但是在快结束或者完成的时候无法减速

尝试使用 kCAMediaTimingFunctionEaseOut 而不是 kCAMediaTimingFunctionEaseIn

rotationAnimation.timingFunction = [CAMediaTimingFunction
                                    functionWithName:kCAMediaTimingFunctionEaseOut];

kCAMediaTimingFunctionEaseIn 指定缓入节奏。缓入节奏导致动画开始缓慢,然后随着它的进行而加速。

kCAMediaTimingFunctionEaseOut 指定缓出步调。缓出节奏会导致动画快速开始,然后在完成时变慢。

您也可以更改 rotationAnimation.duration 以完全减慢动画速度。

 rotationAnimation.duration = 10 

将使动画 运行 10 秒。

来源:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CAMediaTimingFunction_class/index.html#//apple_ref/doc/constant_group/Predefined_Timing_Functions

您还可以从以下 link 中了解有关缓动函数及其行为方式的更多信息。 http://easings.net

正如我在@rakeshbs 的评论中提到的,我想在特定角度停止动画,所以我通过以下方式修改了这段代码。

[CATransaction begin];
CABasicAnimation *rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.byValue = [NSNumber numberWithFloat:20];
rotationAnimation.duration = 2;
rotationAnimation.fromValue = 0;
rotationAnimation.toValue = [NSNumber numberWithFloat:SomeValue];
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
rotationAnimation.removedOnCompletion = NO;
rotationAnimation.fillMode = kCAFillModeForwards;
[ImageView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
[CATransaction commit];

通过这段代码,我可以通过 fromValue 停在特定位置,并通过 [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

控制开始和结束的速度

在动画中间,如果我想提高动画速度,我需要增加 rotationAnimation.byValue 的值,如果降低速度,我需要降低相同的值。

在这里我想提一下,通过这个方法,如果我想一次旋转 MyImageView 360 度,那么我需要设置 rotationAnimation.toValue = [NSNumber numberWithFloat:6.25];.