[ios] UILabel의 배경색에 애니메이션을 적용하는 방법은 무엇입니까?
작동하는 것처럼 보이지만 작동하지 않습니다. 색상이 즉시 녹색으로 바뀝니다.
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의 배경색을 지우도록 설정합니다 (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"];
}
답변
합리적인 프레임 속도 (예 : 20fps)에서 NSTimer 또는 CADisplayLink 콜백을 기반으로 수동으로 색상 애니메이션을 수행합니다. 전체 애니메이션 시간 (예 : 2.0 초)에 대한 분수 경과 시간을 기반으로 RGB 또는 HSV로 고유 한 색상 변경 곡선을 계산하거나 40 개의 중간 색상 배열을 사용해야합니다.
답변
이것을 시도하십시오,
[UIView transitionWithView:yourView duration:0.2 options:UIViewAnimationOptionTransitionNone animations:^{
[yourView setBackgroundColor:[UIColor colorWithRed:0.8588 green:0.8588 blue:0.8588 alpha:1]];
}completion:^(BOOL finished) {
}];
그것은 나를 위해 작동합니다.
답변
나는 최근에이 문제를 다시 한 번 발견했고 몇 가지 조사 끝에 기본적으로 아무것도 바뀌지 않았고 (아마도 가까운 미래에는 없을 것이라고 생각했습니다) 그래서 결국 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, 이제 해당 속성을 가진 모든 것에 배경색을 애니메이션 할 수 있습니다!