在 Swift 4 中从 `POPSpringAnimation` 迁移到原生 iOS 框架
Migrating from `POPSpringAnimation` to native iOS framework in Swift 4
我正在做一个旧项目,想摆脱 POP framework 我相信任何动画都可以用原生 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
}];
但是我没有得到相同的结果,并且出现了一些问题:
- 在 pop 中
springBounciness
等同于 usingSpringWithDamping
吗?
UIView
动画中的springSpeed
相当于什么?
- 时长呢,
POPSpringAnimation
的时长是多少?
编辑:
关于第三个问题我在Github.
中找到了一个issue
如果 UIView
不是可行的方法,可以使用 Core Animation 或任何其他 iOS 原生动画框架来完成吗?
弹出参数取值范围为0-20。但是 usingSpringWithDamping 没有这样的范围。显然,由于 Pop 是一个自定义库,它有自己的取值范围,而 UIView 动画也有自己的取值范围。
从苹果文档上看,usingSpringWithDamping参数其实就是阻尼比,它指定:
To smoothly decelerate the animation without oscillation, use a value
of 1. Employ a damping ratio closer to zero to increase oscillation.
1.So 如果你想要等效的弹性,你需要使用任何小于 1 的值,我想你可以尝试下面的 springBounciness 公式。
float uiViewBounciness = (20.0 - springBounciness) / 20.0;
.. usingSpringWithDamping:uiViewBounciness ..
2.As对于springVelocity,Pop对所有动画帧实现了相同的速度,而UIView动画只指定了INITIAL速度,这个速度会根据总持续时间和阻尼比随时间衰减。因此,要获得尽可能接近的动画效果,您可以执行以下操作:
float uiViewSpeed = springVelocity * 2.0;
.. initialSpringVelocity:uiViewSpeed ..
3.As对于duration,可以在UIView方法中对animateWithDuration实现相同的值
最后,您需要试验这些值并将其与 Pop 动画进行比较。我不认为你可以通过使用 UIView animate 获得与 Pop 完全相同的动画,但它应该足够接近了。
我正在做一个旧项目,想摆脱 POP framework 我相信任何动画都可以用原生 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
}];
但是我没有得到相同的结果,并且出现了一些问题:
- 在 pop 中
springBounciness
等同于usingSpringWithDamping
吗? UIView
动画中的springSpeed
相当于什么?- 时长呢,
POPSpringAnimation
的时长是多少?
编辑: 关于第三个问题我在Github.
中找到了一个issue如果 UIView
不是可行的方法,可以使用 Core Animation 或任何其他 iOS 原生动画框架来完成吗?
弹出参数取值范围为0-20。但是 usingSpringWithDamping 没有这样的范围。显然,由于 Pop 是一个自定义库,它有自己的取值范围,而 UIView 动画也有自己的取值范围。
从苹果文档上看,usingSpringWithDamping参数其实就是阻尼比,它指定:
To smoothly decelerate the animation without oscillation, use a value of 1. Employ a damping ratio closer to zero to increase oscillation.
1.So 如果你想要等效的弹性,你需要使用任何小于 1 的值,我想你可以尝试下面的 springBounciness 公式。
float uiViewBounciness = (20.0 - springBounciness) / 20.0;
.. usingSpringWithDamping:uiViewBounciness ..
2.As对于springVelocity,Pop对所有动画帧实现了相同的速度,而UIView动画只指定了INITIAL速度,这个速度会根据总持续时间和阻尼比随时间衰减。因此,要获得尽可能接近的动画效果,您可以执行以下操作:
float uiViewSpeed = springVelocity * 2.0;
.. initialSpringVelocity:uiViewSpeed ..
3.As对于duration,可以在UIView方法中对animateWithDuration实现相同的值
最后,您需要试验这些值并将其与 Pop 动画进行比较。我不认为你可以通过使用 UIView animate 获得与 Pop 完全相同的动画,但它应该足够接近了。