Подтвердить что ты не робот

Как оживить свойство textColor для UILabel?

По какой-то причине, когда я пытаюсь анимировать textColor, это не сработает. TextColor просто внезапно меняется с A на B. Возможно ли его оживить, от let say red to black?

4b9b3361

Ответ 1

Этот ответ устарел и не является хорошим решением для первоначального вопроса. Ответ @strange ниже намного лучше и должен использоваться вместо этого ответа: fooobar.com/questions/107454/...

//Старый ответ ниже

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

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

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

Ответ 2

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

Цель C

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

Swift

UIView.transitionWithView(creditsLabel, duration: 0.25, options: .TransitionCrossDissolve, animations: {     
    self.creditsLabel.textColor = UIColor.redColor() 
}, 
completion: nil)

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

Ответ 3

Решение Swift 4:

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
  self.yourLabel.textColor = .red
}, completion: nil)

Ответ 4

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

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

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

Вы можете найти полное объяснение + замену с открытым исходным кодом для UILabel в этой статье

Ответ 5

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

Ответ 6

Это была ТОЛЬКО вещь, которая работала для меня:

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

Ответ 7

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

label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];

Ответ 8

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

Ответ 9

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

Я только что изменился с @budidino comments

UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil)