由于某些原因,当我尝试为textColor设置动画时,它将无法正常工作。textColor突然从A变为B。是否可以对其进行动画处理,例如从红色变为黑色?
由于某些原因,当我尝试为textColor设置动画时,它将无法正常工作。textColor突然从A变为B。是否可以对其进行动画处理,例如从红色变为黑色?
Answers:
该答案已过时,对于原始问题不是一个好的解决方案。@strange在下面的答案要好得多,应该代替此答案:https ://stackoverflow.com/a/20892927/76559
//下面的旧答案
该textColor
属性未在文档中指定为可动画设置,因此我认为您不能使用简单的UIView动画块来实现。
NSTimer
每隔几毫秒触发一次,每次将颜色逐渐从另一种设置为另一种时,就可以粗略地做到这一点。
我说这很粗糙,因为它需要从起始颜色到结束颜色的数组或其他一些预设颜色值的容器,而且我敢肯定有一种方法可以使用核心动画或类似方法来完成此操作,我只是不知道不知道那是什么
相反,您尝试像这样在对象本身上使用交叉淡入淡出过渡,它将为您提供从一种颜色到另一种颜色的不错的淡入淡出效果:
目标C
[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];
迅速
UIView.transitionWithView(creditsLabel, duration: 0.25, options: .TransitionCrossDissolve, animations: {
self.creditsLabel.textColor = UIColor.redColor()
},
completion: nil)
由于各种原因,这比使用NSTimers,CATextLayers等更好。CATextLayer对文本字距调整或NSAttributedText没有适当的支持,并且NSTimers太慢了(加上太多的代码)。上面的过渡动画可以解决问题,也可以在链动画中使用。我遇到了同样的问题,并且已经尝试了上面的解决方案,但是这个简单的代码代替了。
UIView.transitionWithView(creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animations: { self.creditsLabel.textColor = UIColor.redColor() }, completion: nil)
Swift 4解决方案:
UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.yourLabel.textColor = .red
}, completion: nil)
UILabel
于该with
财产。如果您执行类似操作transition(with: outerView.label…)
并尝试将其设置在内部,则该操作将自动失败。
options: .easeInOut
,所以我将其改为.transitionCrossDissolve
工作。
您可以尝试创建UILabel的另一个实例或具有textColor的任何实例,然后在这两个实例(具有旧textColor的实例和具有新textColor的实例)之间应用动画。
这是唯一对我有用的东西:
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()
这是我为标签文本颜色设置动画的代码。的重要组成部分,是文字颜色设置为clearColor动画前
label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
感谢@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)
}