2011-10-17 8 views
8

Tengo un UILabel que muestra la puntuación de los usuarios. Y puntuar los cambios de vez en cuando, ¿hay alguna manera de animar este cambio, para incrementar lentamente este número desde su valor actual hasta su valor de resultado? Algo así como http://josheinstein.com/blog/index.php/2010/02/silverlight-animated-turbotax-number-display/ pero para objetivo-c.UILabel cambio de número de animación

+0

me pareció que podría ser útil http://stackoverflow.com/questions/3073520/setting-new-text-to-uilabel-and-animation ** Primer vistazo de respuesta * * – wczekalski

+1

Sí, lo vi, no exactamente la animación que estoy buscando. – Drabuna

Respuesta

18

Use CADisplayLink para cambiar la propiedad de texto de la subclase personalizada de UILabel durante un período de tiempo. Probablemente desee utilizar un NSNumberFormatter para una salida más bonita.

// 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]; 
} 
+3

Nota: si utiliza un 'NSNumberFormatter', cree uno de ellos y vuelva a utilizarlo para cada trabajo de formato que use el mismo formato. Crear un nuevo 'NSNumberFormatter' es bastante caro, pero reutilizar uno existente es barato. –

+0

Sigo recibiendo EXC_BAD_ACESS en 'float current = ([to floatValue] - [from floatValue]) * dt + [from floatValue]'; – Drabuna

+0

¿está usando propiedades para las variables 'from' y' to'? y está configurado para 'retener'? Si no está utilizando propiedades, 'from = [aF retener]' –

4

AUIAnimatedText tiene todo lo que estaba pidiendo. Es un reemplazo para UILabel con posibilidades de animación de texto de alcance,

Cuestiones relacionadas