无法在 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 中减慢动画速度的主要内容,如果未能解决你的问题,请参考以下文章