您能否告诉我如何为UILabel的textColor
设置动画?
例如,我想将颜色从白色更改为红色,然后以淡入效果返回白色并重复约3次。
我需要这个动画,因为我的应用程序从互联网获取实时数据,而在更改值时我需要将此文本值设置为告诉用户它已更改
非常感谢你。
答案 0 :(得分:12)
textColor不可动画的原因是UILabel使用常规CALayer而不是CATextLayer。
为了使textColor可以生成动画(以及文本,字体等),我们可以将UILabel子类化并使其使用CATextLayer。
这是相当多的工作,但幸运的是我已经做到了: - )
您可以在article
中找到完整的解释+ UILabel的直接替代开源替代品答案 1 :(得分:6)
这是一个老问题,但目前使用CrossDissolve对文本颜色进行动画处理绝对是可能的。以下是在Swift中如何做到这一点:
UIView.transition(with: myLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
myLabel.textColor = .white
}, completion: nil)
答案 2 :(得分:4)
我不确定textColor是否可以直接在UILabel上进行动画制作。但是如果你使用CATextLayer,那么获得这种效果会容易得多,
答案 3 :(得分:4)
这个问题很久以前就被提出过了,但现在就去了。
如上所述,UILabel
的textColor不具有动画功能。一个有用的技巧是在代码中动态创建另一个UILabel
,具有相同的属性和位置,但具有目标颜色。您将新UILabel
的alpha设置为0.0到1.0的动画,因此看起来像原始UILabel的textColor是动画的。完成动画后,您可以删除其中一个标签。
这是一个类级别方法的示例,该方法在短时间内更改为不同的textColor并将其更改回来。
+(void)colorizeLabelForAWhile:(UILabel *)label withUIColor:(UIColor *)tempColor animated:(BOOL)animated
{
// We will:
// 1) Duplicate the given label as a temporary UILabel with a new color.
// 2) Add the temp label to the super view with alpha 0.0
// 3) Animate the alpha to 1.0
// 4) Wait for awhile.
// 5) Animate back and remove the temporary label when we are done.
// Duplicate the label and add it to the superview
UILabel *tempLabel = [[UILabel alloc] init];
tempLabel.textColor = tempColor;
tempLabel.font = label.font;
tempLabel.alpha = 0;
tempLabel.textAlignment = label.textAlignment;
tempLabel.text = label.text;
[label.superview addSubview:tempLabel];
tempLabel.frame = label.frame;
// Reveal the temp label and hide the current label.
if (animated) [UIView beginAnimations:nil context:nil];
tempLabel.alpha = 1;
label.alpha = 0;
if (animated) [UIView commitAnimations];
// Wait for while and change it back.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, FOR_AWHILE_TIME*NSEC_PER_SEC), dispatch_get_main_queue(), ^{
if (animated) {
// Change it back animated
[UIView animateWithDuration:0.5 animations:^{
// Animate it back.
label.alpha = 1;
tempLabel.alpha = 0;
} completion:^(BOOL finished){
// Remove the tempLabel view when we are done.
[tempLabel removeFromSuperview];
}];
} else {
// Change it back at once and remove the tempLabel view.
label.alpha = 1.0;
[tempLabel removeFromSuperview];
}
});
}
答案 4 :(得分:0)
使用this answer 两次的方法,有一个简单的解决方案 ,没有任何子类化。
Objective-C中的可能实现可能如下所示:
- (void)blinkTextInLabel:(UILabel *)label toColor:(UIColor *)color
{
[UIView transitionWithView:label duration:0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
// set to background color (change the color if necessary)
label.textColor = [UIColor whiteColor];
} completion:^(BOOL finished) {
[UIView transitionWithView:label duration:0.5f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = color;
} completion:nil];
}];
}
然后只需调用辅助方法(此处:使用UITableViewCell
在同一个类中):
[self blinkTextInLabel:myCell.textLabel toColor:[UIColor redColor]];
这对我使用 iOS 8.3 - 它可能适用于其他版本,因为从iOS 4.0开始使用已使用的方法,但我没有测试过。
我希望这会有所帮助。
答案 5 :(得分:0)
[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = [UIColor redColor];
} completion:^(BOOL finished) {
}];
尝试:)
答案 6 :(得分:0)
感谢this answer - 我用交叉溶解实现了这个目标:
extension UILabel {
func animateTextColor(to color: UIColor) {
UIView.transition(with: self,
duration: 0.25,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.textColor = color
})
}
}
用法:
label.animateTextColor(to: .red)