由于某些原因,当我尝试对textColor
进行动画效果时,它不能正常工作。 textColor
突然从 A 变成了 B。是否可能将其动画效果,例如从红色到黑色?
由于某些原因,当我尝试对textColor
进行动画效果时,它不能正常工作。 textColor
突然从 A 变成了 B。是否可能将其动画效果,例如从红色到黑色?
相反,你是否尝试在对象本身上使用交叉淡入淡出的过渡效果,像这样,它将为你提供一个漂亮的从一种颜色到另一种颜色的淡入淡出效果:
Objective C
[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];
Swift 5
UIView.transition(with: creditsLabel, duration: 0.25, options: .transitionCrossDissolve) {
self.creditsLabel.textColor = .red
}
出于多种原因,这比使用NSTimers、CATextLayers等更好。 CATextLayer不支持适当的文本字间距或NSAttributedText,而NSTimers有延迟(还有太多代码)。 上面的过渡动画就解决了这个问题,并且也可以用作链式动画。 我也遇到了同样的问题,已经尝试过上述解决方案,但是这个简单的代码却奏效。
Swift 4解决方案:
UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.yourLabel.textColor = .red
}, completion: nil)
with
属性具有 UILabel
实例的情况。如果您执行类似于 transition(with: outerView.label…)
的操作并尝试在其中设置它,则会静默失败。 - Sam Soffesoptions: .easeInOut
,所以我将其更改为 .transitionCrossDissolve
就可以了。 - LeoGalantetextColor不可动画化的原因是UILabel使用普通的CALayer而非CATextLayer。
为了使textColor(以及文本、字体等)可动画化,我们可以子类化UILabel并使其使用CATextLayer。
这需要相当多的工作,但幸运的是我已经完成了它 :-)。
您可以在文章中找到完整的解释和一个可替换UILabel的开源组件。
这是唯一对我有效的方法:
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()
您可以尝试创建另一个UILabel实例或具有textColor的其他实例,然后在这两个实例之间应用动画(旧textColor和新textColor的实例)。
label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
textColor
属性为可动画属性,因此我认为你不能使用简单的UIView动画块来实现它...NSTimer
每隔几毫秒触发一次,每次逐渐设置颜色来粗略地完成。CADisplayLink
而不是NSTimer
,因为它与显示更新同步。请参阅WWDC 2014 会议第236节:构建可中断和响应的交互,大约在13:00左右。 - Douglas Hill尝试使用核心动画
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()
}
感谢@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)
}
UIView.transitionWithView(creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animations: { self.creditsLabel.textColor = UIColor.redColor() }, completion: nil)
。 - SimplGy