UIView 动画曲线减速使用 UIViewAnimationOptionCurveEaseOut

Posted

技术标签:

【中文标题】UIView 动画曲线减速使用 UIViewAnimationOptionCurveEaseOut【英文标题】:UIView animation curve slowdown using UIViewAnimationOptionCurveEaseOut 【发布时间】:2014-07-13 02:51:50 【问题描述】:

我试图弄清楚如何在动画发生时改变动画的速度。 将不胜感激任何帮助。

例如,我有一个想要从一端移动到另一端的对象(image1)。我已经实现了UIViewAnimationOptionCurveEaseOut 让动画开始快,然后在结束时减速,问题是速度的变化,从快到慢,几乎看不到,有人可以帮我弄清楚如何结束动画的速度比默认的UIViewAnimationOptionCurveEaseOut 慢得多,这是我正在使用的代码示例。

UIImageView *image1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"theImage.png"]];

image1.frame = CGRectMake(0, 300, 50, 50);

[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:  UIViewAnimationOptionCurveEaseOut
                 animations:^(void) 
                     image1.frame = CGRectMake(700, 300, 50, 50);
                 
                 completion:NULL];

【问题讨论】:

【参考方案1】:

您可以通过在图像视图的图层属性 (CALayer) 上使用自定义计时函数 (CAMediaTimingFunction) 以及关键帧 (CAKeyframeAnimation) 来实现此目的的一种方法。 您需要了解的其他重要概念是贝塞尔曲线、值、关键时间和控制点。 您要做的第一件事是配置动画。此示例将快速打开图像视图,然后在离开屏幕时减慢速度。

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position.y"];
animation.duration             = 2;
animation.repeatCount          = 0;
animation.removedOnCompletion  = NO;
animation.autoreverses         = NO;
animation.fillMode             = kCAFillModeForwards;

NSMutableArray *values = [[NSMutableArray alloc] init];
NSMutableArray *timings = [[NSMutableArray alloc] init];
NSMutableArray *keytimes = [[NSMutableArray alloc] init];

现在这是棘手的部分。这三个数组稍后将被添加到动画中,共同形成速度曲线!进入 values 的第一个值将表示开始位置。请记住,CALayers 是从 1 到 1 的网格系统。所以我想将我的 imageView 放在中心线的顶部。

[values addObject:[NSNumber numberWithFloat:self.imageView.center.y]];

时间是最难理解的部分。它与贝塞尔曲线中的控制点有关。您可以进入 Photoshop 获得准确的分数或 http://ciechanowski.me/blog/2014/02/18/drawing-bezier-curves/ 估计分数。但我发现这些要点有助于更好地缓解...

[timings addObject:[CAMediaTimingFunction functionWithControlPoints:0.1 :0.34 :0.0 :0.0]];
[keytimes addObject:[NSNumber numberWithFloat:0]];

这是目标位置。 (你想要 n-1 个计时函数。N 是值或关键时间的数量。应该有 n 个值和关键时间)。我只是在某个地方选择了屏幕外

[values addObject:[NSNumber numberWithFloat:-self.view.bounds.size.height]];
[keytimes addObject:[NSNumber numberWithFloat:2]];

animation.values = values;
animation.timingFunctions = timings;
animation.keyTimes = keytimes;

[self.imageView.layer addAnimation:animation forKey@"Animate"];

【讨论】:

以上是关于UIView 动画曲线减速使用 UIViewAnimationOptionCurveEaseOut的主要内容,如果未能解决你的问题,请参考以下文章

使用 CADisplayLink“结合”与 CAMediaTimingFunction 为 UIView 设置动画。 (获得任意曲线)

如何为 UIView 关键帧动画设置动画曲线(`func UIView.animateKeyframes()`)

给予uiview animation有哪几种动画曲线

动画 UIView 以“曲线”方式到达目的地,而不是直线前进

3DMAX的Biped动画怎么调曲线

Qt炫酷动画6.QEasingCurve缓动曲线类