Das sieht so aus, als sollte es funktionieren, tut es aber nicht. Die Farbe wird sofort grün.
self.labelCorrection.backgroundColor = [UIColor whiteColor];
[UIView animateWithDuration:2.0 animations:^{
self.labelCorrection.backgroundColor = [UIColor greenColor];
}];
ios
iphone
core-animation
Michiel de Mare
quelle
quelle
Antworten:
Ich kann es nirgendwo dokumentiert finden, aber es scheint, dass die
backgroundColor
Eigenschaft vonUILabel
nicht animierbar ist, da Ihr Code mit einer Vanille gut funktioniertUIView
. Dieser Hack scheint jedoch zu funktionieren, solange Sie die Hintergrundfarbe der Etikettenansicht selbst nicht festlegen:#import <QuartzCore/QuartzCore.h> ... theLabel.layer.backgroundColor = [UIColor whiteColor].CGColor; [UIView animateWithDuration:2.0 animations:^{ theLabel.layer.backgroundColor = [UIColor greenColor].CGColor; } completion:NULL];
quelle
UILabel
. FWIWUIButton
verhält sich genauso wie das Etikett.frame
scheint zumindest die Eigenschaft auch nicht animierbar zu sein, wenn sieUILabel
von einem xib stammt. Es funktioniert, wenn es programmgesteuert erstellt wird, obwohl ... seltsam.Schnell
( wichtig ) Stellen Sie die Hintergrundfarbe des UILabels auf klar (entweder in IB oder im Code). Zum Beispiel:
override func viewDidLoad() { super.viewDidLoad() myLabel.backgroundColor = UIColor.clear }
Animieren Sie die Hintergrundfarbe der Ebene.
@IBAction func animateButtonTapped(sender: UIButton) { UIView.animate(withDuration: 1.0, animations: { self.myLabel.layer.backgroundColor = UIColor.red.cgColor }) }
Beachten Sie, dass
CGColor
nach dem hinzugefügt wirdUIColor
.Ergebnis
quelle
Swift 3
Richten Sie Ihr Etikett wie folgt ein, um die Hintergrundfarbe Ihres Etiketts von Weiß nach Grün zu animieren:
self.labelCorrection.backgroundColor = UIColor.clear self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor
Animieren Sie so:
UIView.animate(withDuration: 2.0) { self.labelCorrection.layer.backgroundColor = UIColor.green.cgColor }
Um zum ursprünglichen Zustand zurückzukehren und erneut zu animieren, müssen Sie die Animationen entfernen:
self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor self.labelCorrection.layer.removeAllAnimations()
quelle
Sie KÖNNEN es animieren, aber ich musste es aus irgendeinem Grund zuerst (programmgesteuert) auf clearColor einstellen. Ohne das funktionierte die Animation entweder nicht oder war nicht sichtbar.
Ich animiere die Hintergrundfarbe eines UILabels in einer benutzerdefinierten Tabellenzelle. Hier ist der Code in der willDisplayCell-Methode. Ich würde nicht versuchen, die Animation in cellForRow festzulegen, da ein Großteil des Layouts von der Tabelle bearbeitet wird.
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ((RouteListCell *)cell).name.backgroundColor = [UIColor clearColor]; [((RouteListCell *)cell).name backgroundGlowAnimationFromColor:[UIColor whiteColor] toColor:[UIColor redColor] clearAnimationsFirst:YES]; }
Hier ist meine Animationsroutine:
-(void) backgroundGlowAnimationFromColor:(UIColor *)startColor toColor:(UIColor *)destColor clearAnimationsFirst:(BOOL)reset; { if (reset) { [self.layer removeAllAnimations]; } CABasicAnimation *anAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"]; anAnimation.duration = 1.00; anAnimation.repeatCount = HUGE_VAL; anAnimation.autoreverses = YES; anAnimation.fromValue = (id) startColor.CGColor; // [NSNumber numberWithFloat:1.0]; anAnimation.toValue = (id) destColor.CGColor; //[NSNumber numberWithFloat:0.10]; [self.layer addAnimation:anAnimation forKey:@"backgroundColor"]; }
quelle
Führen Sie die Farbanimation manuell aus, basierend auf einem NSTimer- oder CADisplayLink-Rückruf mit einer angemessenen Bildrate (z. B. 20 fps). Sie müssen Ihre eigene Farbänderungskurve in RGB oder HSV basierend auf der gebrochenen verstrichenen Zeit über die gesamte Animationszeit (in Ihrem Beispiel 2,0 Sekunden) berechnen oder ein Array von 40 Zwischenfarben verwenden.
quelle
Bitte versuchen Sie dies,
[UIView transitionWithView:yourView duration:0.2 options:UIViewAnimationOptionTransitionNone animations:^{ [yourView setBackgroundColor:[UIColor colorWithRed:0.8588 green:0.8588 blue:0.8588 alpha:1]]; }completion:^(BOOL finished) { }];
Für mich geht das.
quelle
Vor kurzem bin ich erneut auf dieses Problem gestoßen, und nach einigen Recherchen stellte ich fest, dass sich im Grunde nichts geändert hat (und wahrscheinlich in absehbarer Zukunft nicht), sodass ich schließlich das Facebook- POP-Framework verwendete (nicht nur) das dafür verwendete.
Sie können problemlos Animationen grundlegender Eigenschaften sowohl in der Ansicht als auch in der Ebene erstellen. Darüber hinaus bietet es einen reibungslosen Übergang zwischen den Farben (und im Grunde alles, was Sie möchten, auch Ihre benutzerdefinierten Typen, mit zusätzlicher Codierung). Für die Hintergrundfarbe würden Sie also Folgendes tun:
// Create spring animation (there are more types, if you want) let animation = POPSpringAnimation(propertyNamed: kPOPViewBackgroundColor) // Configure it properly animation.autoreverses = false animation.removedOnCompletion = true animation.fromValue = UIColor.yourBeginningColor() animation.toValue = UIColor.yourFinalColor() // Add new animation to your view - animation key can be whatever you like, serves as reference label.pop_addAnimation(animation, forKey: "YourAnimationKey")
Viola, jetzt können Sie Hintergrundfarben für alles animieren, was diese Eigenschaft hat!
quelle
In den Dokumenten heißt es, dass backgroundColor animierbar ist
http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW131
Ich weiß nicht wirklich seit wann.
quelle
Wenn Sie nicht in Quarz eintauchen möchten, erstellen Sie pro Antwort eine der vorherigen Antworten. Erstellen Sie eine leere UIView mit der gleichen Größe wie UILabel und positionieren Sie sie an derselben Stelle wie die UILabel (und in Z-Reihenfolge darunter) animieren Sie die Hintergrundfarbe von UIView (ich habe dies versucht und es funktioniert für mich).
quelle
Swift 4.1 UILabel-Erweiterung:
Fügen Sie diese Erweiterung Ihrem Code hinzu:
extension UILabel { /** Animates the background color of a UILabel to a new color. */ func animateBackgroundColor(to color : UIColor?, withDuration : TimeInterval, completion : ((Bool) -> Void)? = nil) { guard let newColor = color else { return } self.backgroundColor = .clear UIView.animate(withDuration: withDuration, animations: { self.layer.backgroundColor = newColor.cgColor }, completion: completion) } }
Sie sollten es so verwenden:
myUILabel.animateBackgroundColor(to: .red, withDuration: 0.5)
Wenn Sie nun die ursprüngliche Farbe wiederherstellen möchten, verwenden Sie sie wie folgt:
// Storing the orignal color: let originalColor = myUILabel.backgroundColor // Changing the background color: myUILabel.animateBackgroundColor(to: .red, withDuration: 0.5) // ... Later: // Restoring the original color: myUILabel.animateBackgroundColor(to: originalColor, withDuration: 0.5, completion: { (value: Bool) in myUILabel.backgroundColor = originalColor })
quelle
Hier ist die Referenz:
Was ich darüber verstehe, ist, wenn Ihre Ansicht den Animationsblock aufruft und die Hintergrundfarbe Ihrer Ansichtsbeschriftung seitdem grün ist. Wenn Sie dann die Hintergrundfarbe des Etiketts nicht in etwas anderes ändern, ist es immer grün. Das denke ich
quelle