我尝试使用UIPangestureRecognizer
来模拟"弹性"影响。我想拖动一个UIView,但它应该出现在他的超级视图的特定点上。
我尝试使用此代码,使用乘数减少offeset,但它是线性的,效果不是我正在寻找的。 p>
float percentage = distance / maxDistance;
float multiplier = (1 - percentage) ;
CGPoint center = { self.targetView.center.x , self.targetView.center.y + translation.y * multiplier};
[self.targetView setCenter:center];
[recognizer setTranslation:CGPointZero inView:self.view];
我找到了此存储库https://github.com/warrenm/AHEasing,但我不明白如何使用ExponentialEaseOut
。
答案 0 :(得分:7)
我实际上找到了一个非常简单的解决方案。不知道为什么你在这里需要第三方库,一般来说,如果我不需要,我倾向于避免加入它们。
这里你的朋友是双曲正切(tanh)函数。它以45度穿过x轴,然后在输入值2之后在1处达到渐近线。
我用它来实现水平滑动以显示日期/时间(类似于在iOS7消息中完成的方式)。在handlePan:
frameOffset = -OFFSET_MAX * tanh(translation.x / INPUT_SENSITIVITY);
使用OFFSET_MAX和INPUT_SENSITIVITY进行调整以根据您的需要进行调整。我使用80.0f作为OFFSET_MAX(最大距离我希望滑动移动视图)和150.0f作为INPUT_SENSITIVITY。
...
对于端盘动画,您可以使用UIView animateWithDuration
的选项字段来设置正确的动画曲线。在持续时间内,您可以使用固定持续时间(例如,0.15秒)或根据总偏移预返回来缩放该值。鉴于人们期望更快的回弹"对于更大的偏移量,我发现使用固定的持续时间通常看起来非常好。
答案 1 :(得分:2)
经过整整一个下午(我的数学不太好),我找到了解决这个问题的方法。
我已将视图与我的锚点之间的距离标准化,并使用基本函数以非线性方式将此值设为零。 这是我使用的功能。
当用户抬起手指时,我会使用Facebook pop框架带回视图,以模拟花哨的弹簧动画。