从`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
}];
但是,我得到了相同的结果,有些问题上升:
- 是
springBounciness
在弹出相当于usingSpringWithDamping
? - 什么是
springSpeed
的相当于UIView
的动画? - 持续时间是多少,
POPSpringAnimation
的持续时间是多少?
编辑: 关于第三个问题,我在Github发现了一个issue。
如果UIView
不是可以使用Core Animation或任何其他iOS本机动画框架完成的吗?
弹出参数值范围从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完全相同的动画,但它应该足够接近。
够公平的;)这是我们唯一能做的。 – iOSGeek
波普尔正在使用特殊的求解器来决定抑制。你可能会更接近CASpringAnimation,但Pop很难被击败。特别是具有可中断性。 – agibson007
很抱歉评论,但解决方案在这种情况下解决持续时间。问题1也是。我认为2是阻尼和初始速度的组合。 3.求解器使用衰减和查看大小以及春天的反弹来解决持续时间。 – agibson007
@iosgeek请检查我的答案。 TY。 – GeneCode