看起来应该可以,但不能。颜色立即变为绿色。
self.labelCorrection.backgroundColor = [UIColor whiteColor];
[UIView animateWithDuration:2.0 animations:^{
self.labelCorrection.backgroundColor = [UIColor greenColor];
}];
看起来应该可以,但不能。颜色立即变为绿色。
self.labelCorrection.backgroundColor = [UIColor whiteColor];
[UIView animateWithDuration:2.0 animations:^{
self.labelCorrection.backgroundColor = [UIColor greenColor];
}];
Answers:
我在任何地方都找不到文档,但是它的backgroundColor
属性似乎UILabel
不是可动画的,因为您的代码可以在vanilla上正常工作UIView
。但是,只要您不设置标签视图本身的背景色,此hack似乎就可以起作用:
#import <QuartzCore/QuartzCore.h>
...
theLabel.layer.backgroundColor = [UIColor whiteColor].CGColor;
[UIView animateWithDuration:2.0 animations:^{
theLabel.layer.backgroundColor = [UIColor greenColor].CGColor;
} completion:NULL];
UILabel
。FWIW,UIButton
其行为与标签相同。
frame
如果UILabel
来自xib ,则至少该属性似乎也无法动画处理。如果它是通过程序创建的,它确实可以工作,但是...很奇怪。
(重要)将UILabel的背景颜色设置为清除(在IB或代码中)。例如:
override func viewDidLoad() {
super.viewDidLoad()
myLabel.backgroundColor = UIColor.clear
}
设置图层背景色的动画。
@IBAction func animateButtonTapped(sender: UIButton) {
UIView.animate(withDuration: 1.0, animations: {
self.myLabel.layer.backgroundColor = UIColor.red.cgColor
})
}
请注意,CGColor
是在后面添加的UIColor
。
结果
迅捷3
要将标签背景颜色从白色变为绿色,请按以下步骤设置标签:
self.labelCorrection.backgroundColor = UIColor.clear
self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor
像这样动画:
UIView.animate(withDuration: 2.0) {
self.labelCorrection.layer.backgroundColor = UIColor.green.cgColor
}
要回到原始状态,以便可以再次设置动画,请确保删除动画:
self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor
self.labelCorrection.layer.removeAllAnimations()
您可以设置动画,但是出于某种原因,我必须首先(以编程方式)将其设置为clearColor。否则,动画要么不起作用,要么不可见。
我正在自定义表格单元中设置UILabel的背景色。这是willDisplayCell方法中的代码。我不会尝试在cellForRow中设置动画,因为很多布局都被表格修改了。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
((RouteListCell *)cell).name.backgroundColor = [UIColor clearColor];
[((RouteListCell *)cell).name backgroundGlowAnimationFromColor:[UIColor whiteColor] toColor:[UIColor redColor] clearAnimationsFirst:YES];
}
这是我的动画例程:
-(void) backgroundGlowAnimationFromColor:(UIColor *)startColor toColor:(UIColor *)destColor clearAnimationsFirst:(BOOL)reset;
{
if (reset)
{
[self.layer removeAllAnimations];
}
CABasicAnimation *anAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
anAnimation.duration = 1.00;
anAnimation.repeatCount = HUGE_VAL;
anAnimation.autoreverses = YES;
anAnimation.fromValue = (id) startColor.CGColor; // [NSNumber numberWithFloat:1.0];
anAnimation.toValue = (id) destColor.CGColor; //[NSNumber numberWithFloat:0.10];
[self.layer addAnimation:anAnimation forKey:@"backgroundColor"];
}
最近,我再次遇到这个问题,经过研究后,我发现基本上没有任何变化(在可预见的将来可能不会发生变化),因此我最终使用了Facebook POP框架(不仅是)。
您可以轻松地在视图和图层上制作基本属性的动画,但是除此之外,它还可以在颜色之间(以及您想要的任何内容,甚至是您的自定义类型,加上一些额外的编码)提供平滑的过渡。因此,对于背景色,您可以执行以下操作:
// Create spring animation (there are more types, if you want)
let animation = POPSpringAnimation(propertyNamed: kPOPViewBackgroundColor)
// Configure it properly
animation.autoreverses = false
animation.removedOnCompletion = true
animation.fromValue = UIColor.yourBeginningColor()
animation.toValue = UIColor.yourFinalColor()
// Add new animation to your view - animation key can be whatever you like, serves as reference
label.pop_addAnimation(animation, forKey: "YourAnimationKey")
中提琴,现在您可以为具有该属性的所有物体设置背景色动画!
它在文档中说backgroundColor是可动画的
从什么时候开始真的不知道。
Swift 4.1 UILabel扩展:
将此扩展添加到您的代码中:
extension UILabel {
/** Animates the background color of a UILabel to a new color. */
func animateBackgroundColor(to color : UIColor?, withDuration : TimeInterval, completion : ((Bool) -> Void)? = nil) {
guard let newColor = color else { return }
self.backgroundColor = .clear
UIView.animate(withDuration: withDuration, animations: {
self.layer.backgroundColor = newColor.cgColor
}, completion: completion)
}
}
您应该这样使用它:
myUILabel.animateBackgroundColor(to: .red, withDuration: 0.5)
现在,如果要恢复原始颜色,请按以下方式使用它:
// Storing the orignal color:
let originalColor = myUILabel.backgroundColor
// Changing the background color:
myUILabel.animateBackgroundColor(to: .red, withDuration: 0.5)
// ... Later:
// Restoring the original color:
myUILabel.animateBackgroundColor(to: originalColor, withDuration: 0.5, completion: {
(value: Bool) in
myUILabel.backgroundColor = originalColor
})