84

出于某种原因,当我尝试制作动画时textColor,它不起作用。textColor刚刚突然从A变成了B。是否可以对其进行动画处理,例如将红色变为黑色?

4

11 回答 11

201

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

目标 C

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

斯威夫特 5

UIView.transition(with: creditsLabel, duration: 0.25, options: .transitionCrossDissolve) {
    self.creditsLabel.textColor = .red
}

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

于 2014-01-02T22:13:58.457 回答
60

斯威夫特 4解决方案:

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
  self.yourLabel.textColor = .red
}, completion: nil)
于 2016-07-18T12:36:30.503 回答
13

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

为了使 textColor 具有动画效果(以及文本、字体等),我们可以继承 UILabel 以使其使用 CATextLayer。

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

您可以在本文中找到 UILabel 的完整解释 + 一个插入式开源替代品

于 2011-10-23T13:53:52.527 回答
9

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

于 2010-03-11T16:54:16.130 回答
8

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

let changeColor = CATransition()
changeColor.duration = 1

CATransaction.begin()

CATransaction.setCompletionBlock {
    selected.label.layer.add(changeColor, forKey: nil)
    selected.label.textColor = .black
}

selected.nameLabel.textColor = .red

CATransaction.commit()
于 2018-06-26T11:54:52.730 回答
6

该答案已过时,并且不是原始问题的良好解决方案。@strange 下面的答案要好得多,应该代替这个答案使用:https ://stackoverflow.com/a/20892927/76559

//下面的旧答案

textColor属性未在文档中指定为可动画化,因此我认为您不能使用简单的 UIView 动画块来做到这一点...

这可以通过NSTimer每隔几毫秒触发一次非常粗略地完成,每次都会逐渐从一个到另一个设置颜色。

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

于 2010-03-11T16:22:58.197 回答
6

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

label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
于 2014-06-03T08:56:10.007 回答
0

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

于 2013-09-03T11:44:34.203 回答
0

更新了 swift 3.0

我刚从@budidino 评论改过来

UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil)
于 2017-02-09T14:37:10.660 回答
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)
}
于 2020-09-11T15:42:30.393 回答
0

尝试使用核心动画

   func textColorBlinking(){
        let changeColor = CATransition()
        changeColor.duration = 1
        changeColor.type = .fade
        changeColor.repeatCount = Float.infinity
        CATransaction.begin()
        CATransaction.setCompletionBlock {
            self.lblHome.layer.add(changeColor, forKey: nil)
            self.lblHome.textColor = .white
        }
        self.lblHome.textColor = .red
        CATransaction.commit()
   }
于 2022-01-04T09:09:52.863 回答