По какой-то причине, когда я пытаюсь анимировать textColor, это не сработает. TextColor просто внезапно меняется с A на B. Возможно ли его оживить, от let say red to black?
Как оживить свойство textColor для UILabel?
Ответ 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)