Как анимировать свойство textColor UILabel? - PullRequest
75 голосов
/ 11 марта 2010

По какой-то причине, когда я пытаюсь анимировать textColor, он не будет работать. TextColor внезапно меняется с A на B. Можно ли его анимировать, скажем, с красного на черный?

Ответы [ 9 ]

167 голосов
/ 03 января 2014

Вместо этого, если вы попытались использовать переход с плавным переходом на самом объекте, как этот, он даст вам хороший эффект постепенного исчезновения от одного цвета к другому:

[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];

Это лучше, чем использование NSTimers, CATextLayers и т. Д. По разным причинам. CATextLayer не имеет надлежащей поддержки для кернинга текста или NSAttributedText, а NSTimers не работают (плюс слишком много кода). Анимация перехода выше делает свое дело, а также может быть использована в анимации цепочки. У меня была та же проблема, и я уже пробовал решения выше, но этот простой код творит чудеса вместо этого.

51 голосов
/ 18 июля 2016

Swift 4 решение:

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
  self.yourLabel.textColor = .red
}, completion: nil)
12 голосов
/ 23 октября 2011

Причина, по которой textColor не является анимируемым, заключается в том, что UILabel использует обычный CALayer вместо CATextLayer.

Чтобы сделать анимируемым textColor (а также текст, шрифт и т. Д.), Мы можем создать подкласс UILabel, чтобы он использовал CATextLayer.

Это довольно много работы, но, к счастью, я уже сделал это: -)

В этой статье

вы можете найти полное объяснение + замену UILabel с открытым исходным кодом.
9 голосов
/ 11 марта 2010

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

6 голосов
/ 03 июня 2014

Вот мой код для анимации цвета текста метки. Важной частью является установка textColor в clearColor до анимации

label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
5 голосов
/ 26 июня 2018

Это была ЕДИНСТВЕННАЯ вещь, которая работала для меня:

let changeColor = CATransition()
changeColor.duration = 1

CATransaction.begin()

CATransaction.setCompletionBlock {
    selected.label.layer.addAnimation(changeColor, forKey: nil)
    selected.label.textColor = .blackColor()
}

selected.nameLabel.textColor = .redColor()

CATransaction.commit()
5 голосов
/ 11 марта 2010

Свойство textColor не указано как анимируемое в документах, поэтому я не думаю, что вы можете сделать это с помощью простого блока анимации UIView ...

Вероятно, это можно сделать довольно грубо, если NSTimer запускать каждую пару миллисекунд, каждый раз устанавливая цвет постепенно от одного к другому.

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

0 голосов
/ 09 февраля 2017

обновленный swift 3.0

Я только что изменил комментарии @budidino

UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil)
0 голосов
/ 03 сентября 2013

Мне показалось довольно легко разместить UIView под меткой и анимировать его непрозрачность. Метка должна быть добавлена ​​в это представление. Может быть, не очень хорошее решение с точки зрения потребления ресурсов, но довольно простое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...