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

问题描述 投票:72回答:9

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

iphone core-animation
9个回答
4
投票

这个答案已经过时,对原始问题来说不是一个好的解决方案。 @strange在下面的答案要好得多,应该用它代替这个答案:https://stackoverflow.com/a/20892927/76559

//下面的老答案

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

这可能是非常粗暴地完成,每隔几毫秒就会发射一次NSTimer,每次都会逐渐将颜色从一个调整到另一个。

我说这是粗糙的,因为它需要一个阵列或其他容器的预设颜色值从开始颜色到最终颜色,我敢肯定有一种方法可以使用核心动画或其他东西,我只是不要不知道它是什么。


167
投票

相反,你是否试过像这样在对象本身上使用交叉淡入淡出过渡,它会给你一种从一种颜色到另一种颜色的淡入淡出淡出效果:

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

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


51
投票

Swift 4解决方案:

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

12
投票

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

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

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

你可以在这个article找到一个完整的解释+直接替换UILabel的开源代码


9
投票

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


7
投票

这是唯一对我有用的事情:

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

6
投票

这是我为标签文字颜色设置动画的代码。重要的是在动画之前将textColor设置为clearColor

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

0
投票

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


-1
投票

更新了swift 3.0

我刚刚从@budidino评论改变了

UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil)
© www.soinside.com 2019 - 2024. All rights reserved.