По какой-то причине, когда я пытаюсь анимировать textColor, это не сработает. TextColor внезапно меняется с A на B. Можно ли его оживить, скажем, от красного до черного?
По какой-то причине, когда я пытаюсь анимировать textColor, это не сработает. TextColor внезапно меняется с A на B. Можно ли его оживить, скажем, от красного до черного?
Ответы:
Этот ответ устарел и не является хорошим решением исходного вопроса. Ответ @strange ниже намного лучше, и его следует использовать вместо этого ответа: https://stackoverflow.com/a/20892927/76559
// Старый ответ ниже
Это textColor
свойство не указано в документации как анимируемое, поэтому я не думаю, что вы можете сделать это с помощью простого блока анимации UIView ...
Вероятно, это можно было бы сделать довольно грубо, NSTimer
обжигая каждые пару миллисекунд, каждый раз постепенно меняя цвет от одного к другому.
Я говорю, что это грубо, потому что для этого потребуется массив или другой контейнер предустановленных значений цвета, идущих от начального цвета до конечного цвета, и я уверен, что есть способ сделать это, используя базовую анимацию или что-то в этом роде, я просто не не знаю что это.
CADisplayLink
а не NSTimer
управлять анимацией вручную, потому что она синхронизируется с обновлениями дисплея. См. WWDC 2014 Сессия 236: Создание прерываемого и отзывчивого взаимодействия примерно в 13:00.
Вместо этого, если вы пытались использовать переход кроссфейда на самом объекте, как этот, это даст вам хороший эффект постепенного исчезновения от одного цвета к другому:
Цель 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 отстают (плюс слишком много кода). Приведенная выше анимация перехода делает свое дело, и ее также можно использовать в цепной анимации. У меня была такая же проблема, и я уже пробовал решения выше, но вместо этого этот простой код творит чудеса.
UIView.transitionWithView(creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animations: { self.creditsLabel.textColor = UIColor.redColor() }, completion: nil)
Решение Swift 4 :
UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.yourLabel.textColor = .red
}, completion: nil)
UILabel
для with
свойства. Если вы сделаете что-то подобное transition(with: outerView.label…)
и попытаетесь установить это внутри, это потерпит неудачу.
options: .easeInOut
, поэтому я изменил его на .transitionCrossDissolve
и работал.
Причина того, что textColor не анимируется, заключается в том, что UILabel использует обычный CALayer вместо CATextLayer.
Чтобы сделать textColor анимируемым (а также текст, шрифт и т. Д.), Мы можем создать подкласс UILabel, чтобы он использовал CATextLayer.
Это довольно большая работа, но, к счастью, я ее уже сделал :-)
Вы можете найти полное объяснение + замену UILabel с открытым исходным кодом в этой статье.
Вы можете попробовать создать другой экземпляр UILabel или того, что имеет textColor, а затем применить анимацию между этими двумя экземплярами (со старым textColor и одним с новым textColor).
Это было ЕДИНСТВЕННОЕ, что сработало для меня:
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()
Вот мой код для анимации цвета текста метки. Важной частью является создание TextColor для clearColor перед тем анимации
label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
Спасибо за @ Странный ответ «S, прекрасно работает в Swift 5, Xcode 11 с изменением немного синтаксиса. Я анимировал цвет текста для нескольких UILabels, если это тоже ваш случай, попробуйте это
for label in [label1, label2, ...] as [UILabel] { // loop through a @IBOutlet UILabel array
UIView.transition(with: label, duration: 0.3, options: .transitionCrossDissolve, animations: {
label.textColor = .label
}, completion: nil)
}