[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];


답변

빠른

  1. ( 중요 ) UILabel의 배경색을 지우도록 설정합니다 (IB 또는 코드에서). 예를 들면 :

    override func viewDidLoad() {
        super.viewDidLoad()
    
        myLabel.backgroundColor = UIColor.clear
    }
    
  2. 레이어 배경색에 애니메이션을 적용합니다.

    @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, 이제 해당 속성을 가진 모든 것에 배경색을 애니메이션 할 수 있습니다!