2012-07-15 12 views

Respuesta

6

NSTimer hay absolutamente ninguna buena como una herramienta de animación, ni debe ser utilizado para la hora normal en general donde se necesita precisión (velocidad de cuadro) Esta blog post ejemplifica perfectamente mi posición sobre qué hacer con las propiedades UILabel no animables, que deberían enviarse al servidor de renderización a través de CA, no a través de un NSTimer. En lugar de UILabel, puede usar o ajustar CATextLayer y animar su propiedad foregroundColor en el bloque de animación estándar.

+0

El enlace está roto, sería bueno con un ejemplo ... – user1506145

+2

El enlace no está roto ... – CodaFi

0

Es obvio que tendría que usar

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

En cuanto a conseguir realmente a animar y cambiar de color con el tiempo, lo que se necesita para crear una instancia de NSTimer y utilizar el parámetro de @selector que apuntar a un método específico para ejecutar. Cada vez que se ejecuta el temporizador, desencadena el método que luego cambia el color de su UIButton.

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

También puedes ver: http://servin.com/iphone/iPhone-Timers-and-Animated-Views.html

+0

De acuerdo. +1 para el enlace – bkbeachlabs

+0

Tenga en cuenta que esto no reemplaza a una buena animación de CA. Los objetos UIColor pueden no ser animables, pero los objetos CGColor sí lo son. Si pudiera subclase UILabel, entonces podría implementar su propia representación de texto y usar las animaciones CA inherentes. – CodaFi

-2

Esto no es realmente una animación, pero funcionaría.

Crea un temporizador con la frecuencia que quieras animar los colores.

Tienen ese temporizador llamar a un método, changeColorOnButton cada vez que se dispara.

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

Crear una variedad de colores, colorsArray (ya sea organizar los colores antes de tiempo, o añadir un montón a una matriz y mezclarlas para seleccionar al azar. Crear un int, intForColorInArray.

En el método changeColorOnButton , hacer algo como:.

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

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

tomó el método del temporizador de @Stuartsoft. Crédito a quien crédito merece. – bkbeachlabs

1

Esto se responde muy bien here. Básicamente utiliza este tipo práctico: [UIView transitionWithView: duration: options: animations: ^() completion: ^()];

13

Uso de transición con vistas

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

Funciona muy bien.Además, puede usar una vista principal como destino principal y luego animar todas las vistas secundarias de la manera que desee en el bloque 'animaciones' – Peterdk

0

Se pueden utilizar dos botones (o etiquetas, etc.) con diferentes colores que colocó en la misma posición:

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

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

Después de que se puede llegar a la animación de colores por animación de transición de 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)