我使用UIViewAnimationCurveLinear为两点之间的视图设置动画,所以我知道这个动画的速度。在某些情况下,我想附加一个UIViewAnimationCurveEaseOut来使视图慢慢停止。要使此效果无缝,缓出动画必须以与之前的线性动画相同的速度开始。给定我想要缓和的固定距离,如何计算达到这个已知起始速度所需的持续时间?
例如,假设我在10秒内将我的视图从x = 0设置为x = 100。因此速度为10像素/秒。我现在希望视图使用UIViewAnimationCurveEaseOut动画从x = 100减速到x = 120。该动画的持续时间应确保以10像素/秒开始?
据我所知,Core Animation的CAMediaTimingFunction使用三次贝塞尔曲线控制动画调步,其中第二和第三控制点决定曲线的形状。我认为UIViewAnimationCurve缓动函数也是三次贝塞尔曲线。如果我知道这些函数使用的默认控制点,我应该能够计算公式来计算给定速度和距离的持续时间,但我没有设法在任何地方找到这些默认控制点。
答案 0 :(得分:1)
我可能无法给你一个完整的答案,但我可以指向CAMediaTimingFunction的-getControlPointAtIndex:values:方法。这应该让你创建一个EaseOut计时功能,然后检查它的控制点。
我还会向您指出article by Matt Gallagher关于使用CAKeyframeAnimation完成的自定义加速度曲线,这也可能对您有用。
答案 1 :(得分:0)
你可以使用一个常数(称之为BEZIER_INTEGRAL_CONSTANT
)来近似贝塞尔曲线的积分,以1秒/秒的速度开始1秒长的动画。对于线性缓动,此常量为0.5
。对于UIViewAnimationCurveEaseOut
,约为 0.7
。持续时间的公式是:
duration = distance / (velocity * BEZIER_INTEGRAL_CONSTANT)
对于您的示例,距离为20像素,起始速度为10像素/秒,持续时间应约为:20 / (10 * 0.7) = 2.9 seconds
。