如何为UILabel的文本颜色设置动画?

时间:2010-07-23 03:22:41

标签: iphone objective-c animation text uilabel

您能否告诉我如何为UILabel的textColor设置动画

例如,我想将颜色从白色更改为红色,然后以淡入效果返回白色并重复约3次。

我需要这个动画,因为我的应用程序从互联网获取实时数据,而在更改值时我需要将此文本值设置为告诉用户它已更改

非常感谢你。

7 个答案:

答案 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)