如何设置UILabel的textColor属性的动画?

时间:2010-03-11 16:14:27

标签: iphone core-animation

出于某种原因,当我尝试为textColor设置动画时,它将不起作用。 textColor突然从A变为B.是否可以设置动画,从红色到黑色?

10 个答案:

答案 0 :(得分:162)

相反,您是否尝试过像这样对象本身使用交叉淡入淡出过渡,它会为您提供从一种颜色到另一种颜色的淡入淡出淡出效果:

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

由于各种原因,这比使用NSTimers,CATextLayers等更好。 CATextLayer没有对文本字距调整或NSAttributedText的适当支持,并且NSTimers是滞后的(加上代码太多)。上面的过渡动画可以解决这个问题,也可以用在链动画中。我遇到了同样的问题并且已经尝试过上面的解决方案,但是这个简单的代码反而创造了奇迹。

答案 1 :(得分:48)

Swift 4 解决方案:

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

答案 2 :(得分:12)

textColor不可动画的原因是UILabel使用常规CALayer而不是CATextLayer。

为了使textColor可以生成动画(以及文本,字体等),我们可以将UILabel子类化,使其使用CATextLayer。

这是相当多的工作,但幸运的是我已经做到了: - )

您可以在article

中找到完整的解释+ UILabel的直接替代开源替代品

答案 3 :(得分:9)

您可以尝试创建UILabel的另一个实例或其他具有textColor的实例,然后在这两个实例之间应用动画(使用旧的textColor和带有新textColor的实例)。

答案 4 :(得分:6)

这是我为标签文字颜色设置动画的代码。 重要的部分是在动画

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

答案 5 :(得分:5)

textColor属性未在文档中指定为可动画,因此我认为您无法使用简单的UIView动画块执行此操作...

这可能是相当粗略的,每隔几毫秒就会发出一次NSTimer,每次都会逐渐将颜色从一个设置为另一个。

我说这是粗糙的,因为它需要一个数组或其他容器的预设颜色值从开始颜色到结束颜色,我相信你有办法使用核心动画或其他东西,我只是不知道它是什么。

答案 6 :(得分:5)

这是唯一对我有用的东西:

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 :(得分:0)

我发现将UIView放在标签下方并为其不透明度设置动画非常容易。 必须将标签添加到该视图中。 从资源消耗的角度来看,也许不是一个好的解决方案,但非常简单。

答案 8 :(得分:0)

感谢@ Strange 的回答,它在Swift 5,Xcode 11中完美运行,但语法有所变化。我正在为多个UILabel设置文本颜色的动画,如果这也是您的情况,请尝试

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

答案 9 :(得分:-1)

更新了swift 3.0

我刚刚从@budidino发表评论

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