在iOS中实现AnticipateOvershootInterpolator动画

时间:2017-04-03 22:09:26

标签: ios animation uislider

我有一组UISlider控件需要设置动画,从值到另一个值。

动画的要求是它需要匹配(尽可能接近)来自Android平台的AnticipateOvershootInterpolator的效果。
AnticipateOvershootInterpolator提及的文档:

  

一个插补器,其中改变开始向后然后向前飞   并超过目标值,最后回到最后   值。

带有动画的

Here is a video取自this blog

这是我所拥有的结构。为了这个问题,重点将放在1 UISlider上。

[UIView animateWithDuration:1.0
                      delay:1.0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     [self.slider setValue:100 animated:YES];
                 } completion:^(BOOL finished) {
                     if (finished) {
                         //some other stuff
                     }
}];

我希望为options参数找到一个合适的值(我的代码中UIViewAnimationOptionCurveEaseOut,遗憾的是与所需的效果不匹配),以匹配AnticipateOvershootInterpolator效果。<登记/> 我也知道使用animateWithDuration方法可能无法实现这种效果,因此欢迎任何建议。

如何在iOS平台上实现AnticipateOvershootInterpolator效果?

2 个答案:

答案 0 :(得分:0)

如果你想用UIView动画实现它,那么你最好的选择应该是关键帧动画

 UIView.animateKeyframes(withDuration: 0.8, delay: 0, options: [], animations: { 
    UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.25, animations: {
        // start animation update your values here
    })
    UIView.addKeyframe(withRelativeStartTime: 0.24, relativeDuration: 0.25, animations: { 
        // update the postion values here
    })

    // continue adding at least 2 more keyframes with relative start and change your values as you like them
}, completion: nil)

做一个这样的动画,甚至做得更好。你必须研究UIKit Dynamics

// self.view can be any view 
let animator = UIDynamicAnimator(referenceView: self.view)

它有很多有用的选项 你必须研究UIKit动态行为

  • UIGravityBehavior
  • UIFieldBehavior
  • UISnapBehavior

在UIFieldBehaviour中你有很多有用的行为,你应该特别注意的是,ElectricField也会使用UISnapBehavior

答案 1 :(得分:0)

您可以通过首先制作一个减少值(需要设置动画)的常规动画来创建预期效果,并在该完成时添加animate​With​Duration:​delay:​using​Spring​With​Damping:​initial​Spring​Velocity:​options:​animations:​completion以使用过冲效果动画滑块值:) < / p>

像这样的Smth

[self.slider setValue:30 animated:NO];

[UIView animateWithDuration:1.0
                      delay:1.0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     [self.slider setValue:25 animated:YES];
               } completion:^(BOOL finished) {
                   if (finished) {
                       [UIView animateWithDuration:duration 
                                             delay:0 
                            usingSpringWithDamping:0.5
                             initialSpringVelocity:0.0f 
                                           options:0 
                                        animations:^{
                                            [self.slider setValue:80 animated:NO];
                                      } completion:nil];
                 }
}];

希望它有效:)