2011-10-17 18 views
8

Ho un UILabel che visualizza il punteggio degli utenti. E il punteggio cambia di volta in volta, c'è un modo per animare questo cambiamento, per incrementare lentamente questo numero dal suo valore attuale al suo valore di risultato? Qualcosa come http://josheinstein.com/blog/index.php/2010/02/silverlight-animated-turbotax-number-display/ ma per obiettivo-c.UILabel modifica numero animazione

+0

ho trovato che potrebbe essere utile http://stackoverflow.com/questions/3073520/setting-new-text-to-uilabel-and-animation ** Primo sguardo per risposta * * – wczekalski

+1

Sì, l'ho visto, non esattamente l'animazione che sto cercando. – Drabuna

risposta

18

Utilizzare un CADisplayLink per modificare la proprietà di testo della sottoclasse personalizzata di UILabel per un certo periodo di tempo. Probabilmente vorrai usare uno NSNumberFormatter per un'uscita più carina.

// 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: se si utilizza "NSNumberFormatter', crearne uno e riutilizzarlo per ogni lavoro di formattazione che utilizza lo stesso formato. Creare un nuovo 'NSNumberFormatter' è piuttosto costoso, ma riutilizzare uno esistente è economico. –

+0

Continuo a ricevere EXC_BAD_ACESS a 'float current = ([a floatValue] - [da floatValue]) * dt + [da floatValue]'; – Drabuna

+0

stai usando le proprietà per le variabili 'from' e' to'? ed è impostato su 'retain'? Se non stai usando le proprietà fai 'from = [aDa conservare]' –

4

AUIAnimatedText ha tutto quello che stavi chiedendo. Questa è la sostituzione di UILabel con possibilità di animare il testo di copertura,

Problemi correlati