无法在 ios 中减慢动画速度

Posted

技术标签:

【中文标题】无法在 ios 中减慢动画速度【英文标题】:unable to slow down animation speed in ios 【发布时间】:2015-01-06 14:31:06 【问题描述】:

我想在动画即将结束时减慢动画速度。 我正在浏览这段代码。

[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];

但在即将结束或完成块时无法减速。

【问题讨论】:

【参考方案1】:

尝试使用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

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

【讨论】:

但它并没有减慢 CompletionBlock 它只是减慢了旋转动画。 你是什么意思减慢完成块?你不能改变动画的持续时间来减慢动画的速度吗? 我必须在特定角度停止动画所以我正在使用完成块。所以动画的结束是由完成块来完成的。我只想在完成块中减慢它的速度 所以你想以恒定速度旋转一些角度,然后减速到一个角度并停在myAngle*32.72角度? 是的,通过编码,我回答了,我得到了我想要的结果。【参考方案2】:

正如我在 @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];

【讨论】:

通过修改此代码我不需要 CompletionBlock

以上是关于无法在 ios 中减慢动画速度的主要内容,如果未能解决你的问题,请参考以下文章

减慢或暂停 NSAnimationContext

通过jQuery动画减慢滚动到顶部事件

减慢动画中的 UIView 动画

Android Listview减慢滚动速度

逐渐将音频文件从正常速度减慢到半速?

在 Picasso 图像加载器中加载位图图像会减慢列表视图中的滚动速度