iPad: cambio de color de Animate UILabels

Tengo una label que aparece mostrando puntos en mi aplicación. Estoy usando el siguiente código para hacer que la label se haga más grande en escala, luego más pequeña. También me gustaría animar el cambio de color de violeta a verde. ¿Alguien puede apuntarme a un recurso para lograr esto?

mLabel.textColor = [UIColor purpleColor]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:1.0]; [UIView setAnimationDelegate:self]; mLabel.transform = CGAffineTransformMakeScale(1.5,1.5); [UIView setAnimationRepeatCount:1]; mLabel.transform = CGAffineTransformMakeScale(0.5,0.5); mLabel.textColor = [UIColor greenColor]; [UIView commitAnimations]; 

Lamentablemente, el color no se anima con las animaciones UIView. Las respuestas a esta pregunta dan algunas soluciones correctas sin usar Core Animation.

Si no te importa usar un CATextLayer en lugar de un UILabel, entonces el color (y la escala en tu ejemplo) se puede animar así:

 #import <QuartzCore/QuartzCore.h> //Also need to add QuartzCore framework to project (as well as the import). // -(void)animateTextLayer { CGFloat animationDuration = 5; CATextLayer *textLayer = [CATextLayer layer]; [textLayer setString:@"Hello World"]; [textLayer setForegroundColor:[UIColor purpleColor].CGColor]; [textLayer setFontSize:30]; [textLayer setFrame:CGRectMake(20, 200, 300, 40)]; [[self.view layer] addSublayer:textLayer]; CABasicAnimation *colorAnimation = [CABasicAnimation animationWithKeyPath:@"foregroundColor"]; colorAnimation.duration = animationDuration; colorAnimation.fillMode = kCAFillModeForwards; colorAnimation.removedOnCompletion = NO; colorAnimation.fromValue = (id)[UIColor purpleColor].CGColor; colorAnimation.toValue = (id)[UIColor greenColor].CGColor; colorAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; CAKeyframeAnimation *scaleAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; NSArray *scaleValues = [NSArray arrayWithObjects: [NSValue valueWithCATransform3D:CATransform3DScale(textLayer.transform, 1, 1, 1)], [NSValue valueWithCATransform3D:CATransform3DScale(textLayer.transform, 1.5, 1.5, 1)], [NSValue valueWithCATransform3D:CATransform3DScale(textLayer.transform, 0.5, 0.5, 1)], nil]; [scaleAnimation setValues:scaleValues]; scaleAnimation.fillMode = kCAFillModeForwards; scaleAnimation.removedOnCompletion = NO; CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; animationGroup.duration = animationDuration; animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; animationGroup.fillMode = kCAFillModeForwards; animationGroup.removedOnCompletion = NO; animationGroup.animations = [NSArray arrayWithObjects:colorAnimation, scaleAnimation, nil]; [textLayer addAnimation:animationGroup forKey:@"animateColorAndScale"]; } 

Puede usar el método de transición de vista de iOS 4.0 para hacer esto:

 [UIView transitionWithView:statusLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [statusLabel setTextColor:[UIColor whiteColor]]; [statusLabel setShadowColor:[UIColor blackColor]]; } completion:nil]; 

La razón por la que textColor no es animable es que UILabel usa un CALayer regular en lugar de un CATextLayer.

Para hacer textColor animatable (así como text, fuente, etc.) podemos subclamar UILabel y hacer que use un CATextLayer.

Esto es bastante trabajo, pero por suerte ya lo hice 🙂

Puede encontrar una explicación completa + un reemploop de fuente abierta para UILabel en este artículo

Si necesita utilizar los colors IB que se especifican para los estados resaltados o seleccionados y desea animar el cambio de color con el efecto de desvanecimiento, puede usar el siguiente código:

Rápido:

 @IBAction func buttonAction(sender: AnyObject) { // Set selected to leave same color as for highlighted // (default=black, highlighted=networking, selected=networking) self.openAllButton.selected = true // Delay before the color change animation let delayInSeconds = 0.1; let delay = delayInSeconds * Double(NSEC_PER_SEC) let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)); dispatch_after(popTime, dispatch_get_main_queue(), { // Animate color change UIView.transitionWithView(self.openAllButton, duration: 1.0, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: { () -> Void in self.openAllButton.selected = false // selected->default }) { (v:Bool) -> Void in } }); 

}

Esta línea de código funciona para mí. Asegúrese de configurar las opciones para Cross Dissolve Swift:

 static func animationButtonTextColor(button : UIButton, toColor : UIColor, duration : NSTimeInterval) { UIView.transitionWithView(button, duration: duration, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: { button.setTitleColor(toColor, forState: .Normal) }, completion: nil) } 

Agregue esto antes de su llamada a commitAnimations :

 [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:mLabel cache:YES]; 

Prueba esto:

 [UIView animateWithDuration:0.5 animations:^{ label.alpha=0.3; }completion:^(BOOL finished) { label.backgroundcolor=[uicolor purplecolor]; [UIView animateWithDuration:0.5 animations:^{ label.alpha=1.0; }completion:^(BOOL finished) { }]; }];