Как оживить фоновый цвет UILabel?

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

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

Ответ 1

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

#import <QuartzCore/QuartzCore.h>

...

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

[UIView animateWithDuration:2.0 animations:^{
    theLabel.layer.backgroundColor = [UIColor greenColor].CGColor;
} completion:NULL];

Ответ 2

Swift

  • (important) Установите цвет фона UILabel для очистки (как в IB, так и в коде). Например:

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

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

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

Результат

введите описание изображения здесь

Ответ 3

Вы можете анимировать его, но мне пришлось сначала установить его (программно) на 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"];
}

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 8

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

Ответ 9

Попробуйте это,

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

 }];

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

Ответ 10

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

Ответ 11

Вот ссылка:

анимации Объект блока, содержащий изменения для фиксации в представлениях. Здесь вы программно изменить любые анимационные свойства взгляды в иерархии вашего представления. Эта блок не принимает параметров и не имеет возвращаемое значение. Этот параметр не должен NULL

То, что я понимаю об этом, - это когда ваш взгляд вызывает блок анимации, тогда цвет фона ярлыка вашего представления считается зеленым с того времени. Затем, если вы не измените цвет фона метки на что-то еще, тогда он всегда будет зеленым. Это то, что я думаю