2010-09-21 6 views
67

Похоже, что это должно сработать, но нет. Цвет сразу становится зеленым.Как анимировать фоновый цвет UILabel?

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

Для будущих читателей, это не относится к UILabel, но требование в том, что представление должно начинаться с цвета фона, даже если этот цвет ясен. Вы не нуждаетесь в анимации на слое, UIView.backgroundColor отлично работает, если это указано выше. –

ответ

131

я не могу найти его в любом месте документирован, но появляется 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]; 
+0

Это работает, спасибо! Я все еще хотел бы знать, почему UIView работает, а UILabel этого не делает, в конце концов, UILabel является UIView. –

+3

Согласовано. Я могу только предположить, что Apple решила сделать эти свойства неанимированными для 'UILabel'. FWIW, 'UIButton' ведет себя так же, как и метка. – bosmacs

+2

Как ни странно, по крайней мере свойство 'frame', похоже, тоже не анимируется, если' UILabel' происходит от xib. Он работает, если он создан программно, хотя ... странно. –

0

Здесь ссылка:

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

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

2

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

1

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

6

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

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

[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

Я недавно столкнулся с этой проблемой, и после некоторых исследований я понял, что в принципе ничего не изменилось (и, вероятно, не будет в обозримом будущем), поэтому я закончил использование 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") 

Viola, теперь вы можете оживить цвета фона на всем, что имеет эту собственность!

11

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

3

Swift 3

Чтобы оживить цвет этикетки фона от белого до зеленого, настроить ярлык, как это:

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

Animate например:

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

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

self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor 
self.labelCorrection.layer.removeAllAnimations() 
Смежные вопросы