2010-10-15 17 views
19

Ich habe ein Etikett, das Punkte in meiner Anwendung angezeigt wird. Ich verwende den folgenden Code, um das Label größer und kleiner zu machen. Ich möchte auch die Farbe animieren, die von Lila zu Grün wechselt. Kann mir jemand auf eine Ressource hinweisen, um das zu erreichen?iPad: Animate UILabels Farbwechsel

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]; 

Antwort

26

Leider ist die Farbe animieren nicht mit UIView Animationen. Die Antworten auf this question geben einige gute Umgehungslösungen, ohne Core Animation zu verwenden.

Wenn Sie dies nicht mit einem CATextLayer anstelle einer UILabel ausmacht, dann kann die Farbe (und die Skalierung in Ihrem Beispiel) animiert werden:

#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"]; 
} 
+0

wenn nur gäbe es eine Möglichkeit geben, – bioffe

+4

eine vertikale Ausrichtung in CATextLayer zu setzen hier ein _much_ bessere Abhilfe nur mit dem Original UILabel selbst: http: // Stackoverflow .com/questions/6442774/is-uilabels-backgroundcolor-nicht-animierbar/6442868 # 6442868 – Anna

+2

@AnnaKarenina Der Link, auf den Sie hingewiesen haben, ist die Hintergrundfarbe zu animieren. – xhan

0

Fügen Sie diese, bevor Sie Ihren Anruf commitAnimations:

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

Der Grund, dass nicht textcolor animierbaren ist dass UILabel einen regulären CALayer anstelle eines CATextLayers verwendet.

Um textColor animierbar zu machen (sowie Text, Schriftart, etc.) können wir UILabel ableiten und dafür einen CATextLayer verwenden.

Dies ist ein ziemlich viel Arbeit, aber zum Glück :-) Ich habe es schon

Sie können eine vollständige Erklärung finden + ein Drop-in Open-Source-Ersatz für UILabel in diesem article

67

können Sie verwenden iOS 4.0 Ansicht Übergang Methode, dies zu tun:

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

Wow! Das ist ausgezeichnet! Danke für das Teilen! Entschuldigung für die Ausrufezeichen, aber ich wollte gerade eine Unterklasse von CATextLayer erstellen. – RileyE

+0

Dies ist ein ausgezeichneter Tipp. Die angenommene Antwort ist wahrscheinlich technisch korrekter, aber diese Methode erzielt den gleichen Effekt. Danke vielmals. – LeffelMania

+0

Korrigieren. Die Verwendung eines 'CATextLayers' ist die korrektere Antwort, da die Farbwerte zwischen den Farben von und nach interpoliert werden.Dies ist jedoch praktisch, wenn ein einfacher Überblendungsübergang von einer Farbe zu einer anderen ausreicht. – LucasTizma

1

Wenn Sie IB Farben verwenden müssen, die für die markierten oder ausgewählten Staaten festgelegt sind und wollen mit Fade-out-Effekt der Farbänderung animieren zum nächsten Code verwenden können :

Swift:

@IBAction func buttonAction(sender: AnyObject) { 

    // Set selected to leave same color as for highlighted 
    // (default=black, highlighted=red, selected=red) 
    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 
     } 
    }); 

}

0

Dieses Versuchen:

[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) 
     { 

     }]; 

}]; 
1

Diese Codezeile funktioniert für mich. Stellen Sie sicher, dass die Optionen, um zu überqueren auflösen 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) 
    }