2012-07-15 16 views

risposta

6

NSTimer è assolutamente non va bene come strumento di animazione, né deve essere utilizzato per la misurazione del tempo in generale in cui è necessaria la precisione (frame rate) Questo blog post esemplifica perfettamente il mio posizione su cosa fare sulle proprietà UILabel non animabili, che dovrebbero essere inviate al server di rendering attraverso CA, non un NSTimer. Invece di UILabel, puoi utilizzare o avvolgere CATextLayer e animare la sua proprietà foregroundColor nel blocco di animazione standard.

+0

Il collegamento è interrotto, sarebbe un buon esempio ... – user1506145

+2

Il collegamento non è interrotto ... – CodaFi

0

Ovviamente si avrebbe bisogno di utilizzare

[UIButton setTitleColor:[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0] forState:UIControlStateNormal]; 

Per quanto riguarda in realtà ottenerlo per animare e cambiare colore nel tempo, avresti bisogno di creare un'istanza di NSTimer e utilizzare il paramater @selector per puntare a un metodo specifico da eseguire. Ogni volta che il timer viene eseguito, attiva il metodo che cambia il colore di UIButton.

[NSTimer scheduledTimerWithTimeInterval:2.0f 
     target:self 
    selector:@selector(updateCounter:) 
    userInfo:nil 
    repeats:YES]; 

Verificate anche: http://servin.com/iphone/iPhone-Timers-and-Animated-Views.html

+0

concordato. +1 per il collegamento – bkbeachlabs

+0

Si noti che questo non sostituisce una buona animazione CA. Gli oggetti UIColor potrebbero non essere animabili, ma gli oggetti CGColor lo sono assolutamente. Se si potesse sottoclasse UILabel, allora si potrebbe implementare il proprio rendering del testo e utilizzare le animazioni CA inerenti. – CodaFi

-2

Questo non è realmente un'animazione, ma che avrebbe funzionato.

Creare un timer con qualsiasi frequenza con cui si desidera animare i colori.

Avere quel timer chiama un metodo, changeColorOnButton ogni volta che si spara.

[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(changeColorOnButton:) userInfo:nil repeats:YES]; 

Creare una matrice di colori, colorsArray (o organizzare i colori prima del tempo, o aggiungere un gruppo ad un array e shuffle loro di ripartire le probabilità. Creare un int, intForColorInArray.

Nel metodo changeColorOnButton , fare qualcosa di simile:.

- (void) changeColorOnButton:(UIButton *) button { 

    UIColor *nextColor = [colorsArray objectAtIndex:intForColorArray]; 
    [button.titleLabel.setTextColor:nextColor]; 
    intForColorArray = (intForColorArray +1) % [colorsArray count]; 
} 
+0

ha preso il metodo timer da @Stuartsoft. Credito in cui è dovuto il credito. – bkbeachlabs

1

Si risponde molto bene allo here. Praticamente utilizza questo ragazzo pratico: [transizione UIViewWithView: durata: opzioni: animazioni: ^() completamento: ^()];

13

Usa di transizione con vista

[UIView transitionWithView:backButton 
          duration:0.5f 
          options:UIViewAnimationOptionTransitionCrossDissolve 
         animations:^{ 
          [backButton setTitleColor:[_peacock lighten:d.primary] forState:UIControlStateNormal]; 
         } 
         completion:^(BOOL finished){ 
         }]; 
+1

Funziona alla grande.Inoltre, puoi usare una vista genitore come obiettivo principale e quindi animare tutte le viste secondarie nel modo desiderato nel blocco 'animazioni' – Peterdk

0

È possibile utilizzare due pulsanti (o etichette, ecc) con colori diversi che messi a stessa posizione:

button1 = UIButton(frame: frame) 
button2 = UIButton(frame: frame) // same frame 

button1.setTitleColor(UIColor.redColor(), forState: .Normal) // red 
button2.setTitleColor(UIColor.blueColor(), forState: .Normal) // blue 

Dopo di che si può raggiungere l'animazione di colori per animazione di transizione di button2:

UIView.animateKeyframesWithDuration(
    1.0, delay: 0, options: [.Autoreverse, .Repeat], 
    animations: { 
     UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.5, animations: { 
      self.button2.alpha = 1.0 
     }) 

     UIView.addKeyframeWithRelativeStartTime(0.5, relativeDuration: 0.5, animations: { 
      self.button2.alpha = 0.0 
     }) 
    }, completion: nil) 
Problemi correlati