从`POPSpringAnimation`移植到Swift 4中的本机iOS框架

问题描述:

我正在处理一个旧项目并想摆脱POP framework我确信任何动画都可以用本机iOS框架完成。从`POPSpringAnimation`移植到Swift 4中的本机iOS框架

这里是旧代码:

POPSpringAnimation *springAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewFrame]; 
springAnimation.toValue = [NSValue valueWithCGRect:rect]; 
springAnimation.velocity = [NSValue valueWithCGRect:CGRectMake(springVelocity, springVelocity, 0, 0)]; 
springAnimation.springBounciness = springBounciness; 
springAnimation.springSpeed = springSpeed; 
[springAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) { 
    if (finished) { 
     // cool code here 
    } 
}]; 

[self.selectedViewController.view pop_addAnimation:springAnimation forKey:@"springAnimation"]; 

我曾尝试:

[UIView animateWithDuration:1.0 
         delay:0 
    usingSpringWithDamping:springBounciness 
     initialSpringVelocity:springVelocity 
        options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
         self.selectedViewController.view.frame = rect; 
} completion:^(BOOL finished) { 
    // cool code here 
}]; 

但是,我得到了相同的结果,有些问题上升:

  1. springBounciness在弹出相当于usingSpringWithDamping
  2. 什么是springSpeed的相当于UIView的动画?
  3. 持续时间是多少,POPSpringAnimation的持续时间是多少?

编辑: 关于第三个问题,我在Github发现了一个issue

如果UIView不是可以使用Core Animation或任何其他iOS本机动画框架完成的吗?

+0

波普尔正在使用特殊的求解器来决定抑制。你可能会更接近CASpringAnimation,但Pop很难被击败。特别是具有可中断性。 – agibson007

+0

很抱歉评论,但解决方案在这种情况下解决持续时间。问题1也是。我认为2是阻尼和初始速度的组合。 3.求解器使用衰减和查看大小以及春天的反弹来解决持续时间。 – agibson007

+0

@iosgeek请检查我的答案。 TY。 – GeneCode

弹出参数值范围从0-20。但useSpringWithDamping没有这样的范围。显然,由于Pop是一个自定义库,它有它自己的值范围,而UIView动画有它自己的。

从苹果文档,usingSpringWithDamping参数实际上是阻尼比的,它指定:

为了顺利减速没有振荡的动画,使用值1的录用一个 阻尼比更接近零,以增加振荡。

1.因此,如果你想要相当的弹性,你需要使用低于1的任何值,我想你可以尝试下面的公式springBounciness。

float uiViewBounciness = (20.0 - springBounciness)/20.0; 
.. usingSpringWithDamping:uiViewBounciness .. 

2.As为springVelocity,流行实现相同的速度对于所有的动画帧,而UIView的动画仅指定初始速度,该速度是基于总持续时间和阻尼比衰减随时间。因此,要获得尽可能接近动画越好,你可以做到以下几点:

float uiViewSpeed = springVelocity * 2.0; 
.. initialSpringVelocity:uiViewSpeed .. 

3.As的持续时间,可以实现在UIView的方法相同的值animateWithDuration。

最后,您需要试验这些值并将其与Pop动画进行比较。我不认为你可以通过使用UIView动画获得与Pop完全相同的动画,但它应该足够接近。

+0

够公平的;)这是我们唯一能做的。 – iOSGeek