[iphone] UILabel의 textColor 속성에 애니메이션을 적용하는 방법은 무엇입니까?

어떤 이유로 textColor에 애니메이션을 적용하려고하면 작동하지 않습니다. textColor가 갑자기 A에서 B로 바뀝니다. 애니메이션을 적용 할 수 있습니까? 빨강에서 검정으로 전환 할 수 있습니까?



답변

이 답변은 구식이며 원래 질문에 대한 좋은 해결책이 아닙니다. 아래 @strange의 답변이 훨씬 더 좋으며이 답변 대신 사용해야합니다. https://stackoverflow.com/a/20892927/76559

// 아래의 이전 답변

textColor난 당신이 간단한 UIView의 애니메이션 블록과 그것을 할 수 있다고 생각하지 않도록 속성은 워드 프로세서에서 애니메이션로서 지정되지 않은 …

이것은 아마도 NSTimer몇 밀리 초마다 발화 하여 매우 조잡하게 수행 될 수 있으며 매번 색상을 점차적으로 설정할 수 있습니다.

시작 색상에서 종료 색상으로 이동하는 사전 설정된 색상 값의 배열 또는 다른 컨테이너가 필요하기 때문에 조잡하다고 말합니다. 핵심 애니메이션 등을 사용하여이 작업을 수행 할 수있는 방법이 있다고 확신합니다. 그것이 무엇인지 모릅니다.


답변

대신 다음과 같이 개체 자체에 크로스 페이드 전환을 사용해 보았 으면 한 색상에서 다른 색상으로 멋진 페이드 인 페이드 아웃 효과를 얻을 수 있습니다.

목표 C

[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];

빠른

UIView.transitionWithView(creditsLabel, duration: 0.25, options: .TransitionCrossDissolve, animations: {
    self.creditsLabel.textColor = UIColor.redColor()
},
completion: nil)

이것은 다양한 이유로 NSTimers, CATextLayers 등을 사용하는 것보다 낫습니다. CATextLayer는 텍스트 커닝 또는 NSAttributedText에 대한 적절한 지원이 없으며 NSTimers는 느립니다 (코드가 너무 많음). 위의 전환 애니메이션은 트릭을 수행하며 체인 애니메이션에서도 사용할 수 있습니다. 나는 같은 문제가 있었고 이미 위의 해결책을 시도했지만이 간단한 코드가 대신 놀라운 일을합니다.


답변

Swift 4 솔루션 :

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
  self.yourLabel.textColor = .red
}, completion: nil)


답변

textColor가 애니메이션 불가능한 이유는 UILabel이 CATextLayer 대신 일반 CALayer를 사용하기 때문입니다.

textColor를 애니메이션 가능하게 만들기 위해 (텍스트, 글꼴 등) UILabel을 하위 클래스로 만들어 CATextLayer를 사용할 수 있습니다.

이것은 꽤 많은 작업이지만 운 좋게도 이미 해냈습니다 🙂

기사 에서 UILabel에 대한 완전한 설명 + 드롭 인 오픈 소스 대체를 찾을 수 있습니다.


답변

UILabel의 다른 인스턴스 또는 textColor가있는 인스턴스를 만든 다음 두 인스턴스 (이전 textColor 및 새 textColor가있는 인스턴스)간에 애니메이션을 적용 할 수 있습니다.


답변

이것은 나를 위해 일한 유일한 것입니다.

let changeColor = CATransition()
changeColor.duration = 1

CATransaction.begin()

CATransaction.setCompletionBlock {
    selected.label.layer.addAnimation(changeColor, forKey: nil)
    selected.label.textColor = .blackColor()
}

selected.nameLabel.textColor = .redColor()

CATransaction.commit()


답변

다음은 레이블 텍스트 색상을 애니메이션하는 코드입니다. 중요한 부분은 clearColor에 텍스트 색상을 설정하는 것입니다 애니메이션 전에

label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];