Objective-c:实现轻松动画

时间:2014-05-10 07:05:43

标签: ios objective-c functional-programming

我有以下代码来为分数标签设置动画。你会如何改变它,以便它成为一个轻松的动画?

由于

- (void)animateFrom:(float)fromValue toValue:(float)toValue
{
    self.scoreAnimationFrom = fromValue;
    self.scoreAnimationTo = self.question.correctValue;

    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(animateNumber:)];

    self.startTimeInterval = CACurrentMediaTime();
    [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}

- (void)animateNumber:(CADisplayLink *)link
{
    float dt = ([link timestamp] - self.startTimeInterval) / self.duration;

    if (dt >= 1.0)
    {
        [link removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
        return;
    }

    float current = ((self.scoreAnimationTo - self.scoreAnimationFrom) * dt + self.scoreAnimationFrom);
    self.valueLabel.text = [NSString stringWithFormat:@"%f", current];
}

2 个答案:

答案 0 :(得分:6)

动画的进度由dt变量描述,该变量是介于0和1之间的值。对动画应用缓动时间就像在应用之前将此值汇集到适当的计时函数一样简单它进一步。定时功能的职责是根据特定的时序曲线将原始值转换为0到1之间的另一个值。有关计时功能的更多信息,请参阅Apple documentation

在您的情况下,您需要对dt应用缓出计时功能,例如:

dt = [[TimingFunction easeOutTimingFunction] solveForInput:dt];

Core Animation提供了CAMediaTimingFunction类,但遗憾的是它的_solveForInput:求解方法是私有的。存在几种可以使用的定时函数的开源实现,例如, https://github.com/warrenm/AHEasing

如果您感到好奇,我还recently implemented_solveForInput:类别中CAMediaTimingFunction等同于{{1}}的方法。

答案 1 :(得分:0)

通过使用sin函数而不是使用多项式系数进行复杂曲线计算,我得到了一个非常简单的解决方案:

//EasyOut
dt = sin(dt*M_PI/2)+0.01f;

享受它:)