我有一个显示用户分数的UILabel。分数会不时地改变,有没有一种方法可以动画显示这个变化,从当前值缓慢增加到结果值?
类似于http://josheinstein.com/blog/index.php/2010/02/silverlight-animated-turbotax-number-display/,但是用于Objective-C。
使用CADisplayLink在一段时间内更改自定义的UILabel子类的文本属性。您可能希望使用 NSNumberFormatter
进行更漂亮的输出。
// Create instance variables/properties for: `from`, `to`, and `startTime` (also include the QuartzCore framework in your project)
- (void)animateFrom:(NSNumber *)aFrom toNumber:(NSNumber *)aTo {
self.from = aFrom; // or from = [aFrom retain] if your not using @properties
self.to = aTo; // ditto
self.text = [from stringValue];
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(animateNumber:)];
startTime = CACurrentMediaTime();
[link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
- (void)animateNumber:(CADisplayLink *)link {
static float DURATION = 1.0;
float dt = ([link timestamp] - startTime) / DURATION;
if (dt >= 1.0) {
self.text = [to stringValue];
[link removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
return;
}
float current = ([to floatValue] - [from floatValue]) * dt + [from floatValue];
self.text = [NSString stringWithFormat:@"%i", (long)current];
}
NSNumberFormatter
,请创建一个并将其重复使用于每个使用相同格式的格式化工作中。创建新的NSNumberFormatter
非常昂贵,但是重复使用现有的则很便宜。 - Lily Ballardfloat current = ([to floatValue] - [from floatValue]) * dt + [from floatValue]
; - Drabunafrom
和to
变量中使用了属性?并且它们的设置为retain
吗?如果你没有使用属性,请使用from = [aFrom retain]
。 - Jason HarwigAUIAnimatedText
就是你所需要的一切。它是一个可以替代UILabel并具有丰富文本动画功能的组件。