我有下面的代码来动画分数标签.你会如何改变它,以便它成为一个轻松的动画?
谢谢
- (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]; }
defagos.. 6
动画的进度由dt
变量描述,该变量是介于0和1之间的值.对动画应用缓动时序非常简单,只需将此值汇总到适当的计时函数中,然后再应用它.定时功能的职责是根据特定的时序曲线将原始值转换为0到1之间的另一个值.有关计时功能的更多信息,请参阅Apple文档.
因此,在您的情况下,您需要应用缓出计时功能dt
,例如:
dt = [[TimingFunction easeOutTimingFunction] solveForInput:dt];
Core Animation提供了CAMediaTimingFunction
类,但遗憾的是它的_solveForInput:
解决方法是私有的.存在几种可以使用的定时函数的开源实现,例如https://github.com/warrenm/AHEasing.
如果你很好奇,我最近也实现了一个等同_solveForInput:
于一个类别的方法CAMediaTimingFunction
.