Как анимировать цвет фона UILabel? - PullRequest
72 голосов
/ 21 сентября 2010

Похоже, это должно работать, но не работает. Цвет сразу становится зеленым.

self.labelCorrection.backgroundColor = [UIColor whiteColor];
[UIView animateWithDuration:2.0 animations:^{
    self.labelCorrection.backgroundColor = [UIColor greenColor];
}];

Ответы [ 11 ]

140 голосов
/ 21 сентября 2010

Я не могу найти его нигде в документации, но кажется, что свойство backgroundColor в UILabel не анимируемо, так как ваш код отлично работает с ванилью UIView. Этот хак работает, однако, до тех пор, пока вы не установите цвет фона самого представления метки:

#import <QuartzCore/QuartzCore.h>

...

theLabel.layer.backgroundColor = [UIColor whiteColor].CGColor;

[UIView animateWithDuration:2.0 animations:^{
    theLabel.layer.backgroundColor = [UIColor greenColor].CGColor;
} completion:NULL];
18 голосов
/ 09 октября 2015

Swift

  1. ( важно ) Установите прозрачный цвет фона UILabel (либо в IB, либо в коде).Например:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        myLabel.backgroundColor = UIColor.clear
    }
    
  2. Анимировать цвет фона слоя.

    @IBAction func animateButtonTapped(sender: UIButton) {
    
        UIView.animate(withDuration: 1.0, animations: {
            self.myLabel.layer.backgroundColor = UIColor.red.cgColor
        })
    }
    

Обратите внимание, что CGColor добавляется после UIColor.

Результат

enter image description here

7 голосов
/ 05 мая 2017

Swift 3

Чтобы анимировать цвет фона ярлыка от белого до зеленого, настройте ярлык следующим образом:

self.labelCorrection.backgroundColor = UIColor.clear
self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor

Анимировать так:

UIView.animate(withDuration: 2.0) { 
    self.labelCorrection.layer.backgroundColor = UIColor.green.cgColor
}

Чтобы вернуться к исходному состоянию, чтобы вы могли снова анимировать, убедитесь, что вы удалили анимацию:

self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor
self.labelCorrection.layer.removeAllAnimations()
7 голосов
/ 09 октября 2013

Вы МОЖЕТЕ анимировать его, но мне пришлось сначала установить его (программно) на clearColor по какой-то причине.Без этого анимация либо не работала, либо не была видна.

Я анимирую цвет фона UILabel в пользовательской ячейке таблицы.Вот код в методе willDisplayCell.Я не стал бы пытаться установить анимацию в cellForRow, так как большая часть макета возиться с таблицей.

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

Вот моя процедура анимации:

-(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"];
}
2 голосов
/ 15 июля 2015

Я недавно столкнулся с этой проблемой еще раз, и после некоторого исследования я решил, что в принципе ничего не изменилось (и, вероятно, не произойдет в обозримом будущем), поэтому я в конечном итоге использовал Facebook POP framework (не только)для этого.

Вы можете легко создавать анимацию основных свойств как для вида, так и для слоя, но, кроме того, он обеспечивает плавный переход между цветами (и в основном все, что вы хотите, даже ваши пользовательские типы, с некоторым дополнительным кодированием).Поэтому для цвета фона вы должны сделать что-то вроде этого:

   // 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")

Альт, теперь вы можете анимировать цвета фона для всего, что имеет это свойство!

2 голосов
/ 11 октября 2013

Пожалуйста, попробуйте это,

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

 }];

Это работает для меня.

2 голосов
/ 21 сентября 2010

Выполните цветную анимацию вручную, основываясь на обратном вызове NSTimer или CADisplayLink с некоторой разумной частотой кадров (скажем, 20 кадров в секунду). Вам нужно будет рассчитать собственную кривую изменения цвета в RGB или HSV на основе доли прошедшего времени в течение полного времени анимации (2,0 секунды в вашем примере) или использовать массив из 40 промежуточных цветов.

1 голос
/ 30 марта 2011

Если вы не хотите углубляться в Кварц, для каждого из предыдущих ответов создайте пустой UIView того же размера, что и UILabel, и расположите его в том же месте, что и UILabel (и в Z-порядке под ним).и вы можете анимировать этот цвет фона UIView (я пробовал это, и он работает для меня).

1 голос
/ 06 марта 2011

в документах говорится, что backgroundColor является анимируемым

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW131

Не знаю с каких пор.

0 голосов
/ 25 июня 2018

Swift 4.1 UILabel Extension:

Добавьте это расширение к своему коду:

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)
    }

}

Вы должны использовать это так:

myUILabel.animateBackgroundColor(to: .red, withDuration: 0.5)

Теперь, если вы хотите восстановить исходный цвет, используйте его так:

// 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
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...