작동하는 것처럼 보이지만 작동하지 않습니다. 색상이 즉시 녹색으로 바뀝니다.
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];
}];
답변:
어디서나 문서화 된 것을 찾을 수 는 없지만 코드가 vanilla에서 잘 작동하기 때문에 의 backgroundColor
속성이 UILabel
애니메이션 불가능한 것처럼 보입니다 UIView
. 이 해킹은 레이블보기 자체의 배경색을 설정하지 않는 한 작동하는 것처럼 보입니다.
#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
가져온 속성은 애니메이션화 할 수없는 것 같습니다 . 그래도 프로그래밍 방식으로 생성되면 작동합니다. 이상합니다.
( 중요 ) 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")
Viola, 이제 해당 속성을 가진 모든 것에 배경색을 애니메이션 할 수 있습니다!
문서에서 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
})