Похоже, он должен работать, но нет. Цвет сразу становится зеленым.
self.labelCorrection.backgroundColor = [UIColor whiteColor];
[UIView animateWithDuration:2.0 animations:^{
self.labelCorrection.backgroundColor = [UIColor greenColor];
}];
Похоже, он должен работать, но нет. Цвет сразу становится зеленым.
self.labelCorrection.backgroundColor = [UIColor whiteColor];
[UIView animateWithDuration:2.0 animations:^{
self.labelCorrection.backgroundColor = [UIColor greenColor];
}];
Я не могу найти его документально, но похоже, что свойство 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];
(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
.
Результат
Вы можете анимировать его, но мне пришлось сначала установить его (программно) на 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"];
}
Сделайте цветную анимацию вручную, исходя из обратного вызова NSTimer или CADisplayLink с некоторой разумной частотой кадров (скажем, 20 кадров в секунду). Вам нужно будет вычислить свою собственную переменную изменения цвета в RGB или HSV на основе дробного прошедшего времени в течение всего времени анимации (например, 2,0 секунды в вашем примере) или использовать массив из 40 промежуточных цветов.
Недавно я столкнулся с этой проблемой, и после некоторого исследования я понял, что в принципе ничего не изменилось (и, вероятно, не будет в обозримом будущем), поэтому я закончил использование 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")
Виола, теперь вы можете анимировать цвета фона во всем, что имеет это свойство!
Прежде всего, я не пробовал это сам, но я подумал об этом в последние недели. Я думаю, что цветовое свойство вашего представления не может быть анимировано, например, "скрыто", изменения будут отображаться сразу. Возможным решением было бы наложить две надписи на верхнюю с вашим старым цветом, а нижнюю - на новую. Тогда вы можете просто выпустить верхнюю часть. Я не уверен, хотя, если смешение будет выглядеть красиво.
в документах говорится, что backgroundColor является анимированным
Не знаю с тех пор.
Если вы не хотите окунаться в Quartz, за ответ на один из предыдущих ответов, создайте пустой UIView того же размера, что и UILabel, и расположите его в том же месте, что и UILabel (и в порядке Z, под ним) и вы можете оживить этот цвет фона UIView (я пробовал это, и он работает для меня).
Попробуйте это,
[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) {
}];
Это работает для меня.
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()
Вот ссылка:
анимации Объект блока, содержащий изменения для фиксации в представлениях. Здесь вы программно изменить любые анимационные свойства взгляды в иерархии вашего представления. Эта блок не принимает параметров и не имеет возвращаемое значение. Этот параметр не должен NULL
То, что я понимаю об этом, - это когда ваш взгляд вызывает блок анимации, тогда цвет фона ярлыка вашего представления считается зеленым с того времени. Затем, если вы не измените цвет фона метки на что-то еще, тогда он всегда будет зеленым. Это то, что я думаю