2010-03-11 13 views

Respuesta

4

La propiedad textColour no se especifica que es animateable en la documentación, por lo que no creo que se puede hacer con un simple UIView bloquean animaciones ...

Esto probablemente se podría hacer bastante toscamente con un NSTimer disparando cada dos milisegundos, cada vez ajustando el color gradualmente de uno a otro.

Digo que es crudo porque requeriría una matriz o algún otro contenedor de valores de color preestablecidos desde el color inicial hasta el final, y estoy seguro de que hay una forma de hacerlo con animación central o algo , Simplemente no sé lo que es.

+0

o: una función que lanza hacia fuera una matriz con valores RGB entre A y B y un porcentaje dado. Sin embargo, no sé nada sobre los algoritmos de color. – dontWatchMyProfile

+0

aquí hay buenas soluciones: [aquí] (http://stackoverflow.com/questions/6442774/is-uilabels-backgroundcolor-not-animatable/6442868#6442868) y [aquí] (http://stackoverflow.com/a/3947389/1076848) gracias a Anna Karenina – jackal

+4

Debe usar 'CADisplayLink' en lugar de' NSTimer' para controlar manualmente las animaciones porque está sincronizado con las actualizaciones de pantalla. Ver [WWDC 2014 Session 236: Construir Interacciones Interrumpibles y Sensibles] (https://developer.apple.com/videos/play/wwdc2014-236/) alrededor de las 13:00. –

9

usted podría intentar crear otra instancia de la UILabel o lo que sea que tiene el textColor, y luego aplicar la animación entre esos dos casos (el con el viejo textColor y el que tiene el nuevo textColor).

11

El motivo por el que textColor no es animable es que UILabel utiliza un CALayer normal en lugar de un CATextLayer.

Para que textoColor sea animable (así como texto, fuente, etc.) podemos subclase UILabel para que use CATextLayer.

Este es un buen montón de trabajo, pero por suerte yo ya hice :-)

puede encontrar una explicación completa + una gota en el reemplazo de código abierto para UILabel en este article

+0

¡sí se ve genial, mucho! – Nils

0

encontré es bastante fácil colocar una UIView debajo de la etiqueta y animar su opacidad. La etiqueta debe agregarse a esa vista. Quizás no sea una buena solución desde el punto de vista del consumo de recursos, pero es bastante sencilla.

131

En su lugar, ¿Ha intentado utilizar una transición de fundido en el propio objeto de este tipo, que va a darle un buen efecto de desaparición de desaparición gradual de un color a otro:

[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
    myLabel.textColor = NEW_COLOR; 
} completion:^(BOOL finished) { 
}]; 

Esto es mejor que usar NSTimers, CATextLayers, etc. por varias razones. CATextLayer no tiene soporte adecuado para el kerning de texto o NSAttributedText, y los NSTimers son laggy (además de que hay demasiado código). La animación de transición de arriba hace el truco, y también se puede usar en una animación en cadena. Tuve el mismo problema y ya he probado las soluciones anteriores, pero este código simple funciona de maravilla.

+6

Agradable, elegante, en realidad la mejor y más limpia solución. – maksa

+13

Genial. Funciona en Swift de la misma manera: 'UIView.transitionWithView (creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animaciones: {self.creditsLabel.textColor = UIColor.redColor()}, finalización: nil)' – SimplGy

+0

¡Genial! Gracias. ¡sencillo! – Itzdsp

4

Aquí está mi código para animar el color del texto de la etiqueta. La parte importante es establecer textColor a clearColor antes de la animación

label.textColor = [UIColor clearColor]; 
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
    label.textColor = self.highlightedCellPrimaryTextColor; 
} completion:^(BOOL finished) { }]; 
16

Swift solución 4:

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: { 
    self.yourLabel.textColor = .red 
}, completion: nil) 
-1

actualiza rápida 3.0

acabo de cambiar de @budidino comentarios

UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil) 
Cuestiones relacionadas