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


82

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

답변:


6

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

// 아래의 이전 답변

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

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

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


또는 : A와 B 사이의 RGB 값과 주어진 백분율을 가진 배열을 버리는 함수. 그래도 색상 알고리즘에 대해서는 아무것도 모릅니다.
dontWatchMyProfile 2010 년

여기에 좋은 해결 방법이 있습니다. 여기여기 Anna Karenina에게 감사드립니다
jackal

4
디스플레이 업데이트와 동기화되므로 애니메이션을 수동으로 구동 하는 CADisplayLink대신 을 사용해야 NSTimer합니다. 약 13:00에 WWDC 2014 세션 236 : 인터럽트 및 반응 형 상호 작용 구축을 참조하십시오 .
Douglas Hill

이것은 당시에 사실이더라도 더 이상 받아 들여지지 않아야합니다. 아래 이상한 대답을 참조하십시오
bitwit dec.

Stack Overflow는 수락 되었으므로이 쓸모없는 답변을 삭제할 수 없습니다. 아래 @strange의 답변을 확인하십시오.
Jasarien

194

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

목표 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는 느립니다 (코드가 너무 많음). 위의 전환 애니메이션은 트릭을 수행하며 체인 애니메이션에서도 사용할 수 있습니다. 나는 같은 문제가 있었고 이미 위의 해결책을 시도했지만이 간단한 코드가 대신 놀라운 일을합니다.


7
멋지고 우아하며 실제로 가장 좋고 깨끗한 솔루션입니다.
막사

17
큰. Swift에서도 동일하게 작동합니다.UIView.transitionWithView(creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animations: { self.creditsLabel.textColor = UIColor.redColor() }, completion: nil)
SimplGy

8
참고 : 이것은 레이블이 정적 일 때만 작동합니다. 이 작업을 수행하고 레이블의 위치가 수정되면 페이드 아웃 애니메이션이보기 흉한 아티팩트를 표시합니다.
Lukas Petr 2016

Xcode 10.2.1 및 Swift 5에서 작동하지 않습니다. 아래의 'shokaveli'방법이 작동합니다
Martin

SwiftUI에서 이것을 수행하는 방법을 찾고 있었지만 당시에는 지원되지 않는 것 같습니다.
philipp

58

Swift 4 솔루션 :

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

속성 에 UILabel대한 인스턴스가있는 경우에만 작동합니다 with. 만약 당신이 뭔가를 transition(with: outerView.label…)하고 그것을 안에 넣으려고하면, 그것은 조용히 실패 할 것입니다.
Sam Soffes

어떤 이유로 나를 위해 작동하지 않습니다. 애니메이션이 진행되는 동안 점진적이지 않고 갑자기 변경됩니다. :(
ScottyBlades

1
@ScottyBlades 아마도 백그라운드 스레드에서 애니메이션을하고 있습니까? DispatchQueue.main.async {} 괄호 안에 UIView.transition 코드를 래핑 해보세요.
budidino

1
참고로-처음 시도했을 때 작동하지 않았고 그것은 내가 가지고 있었기 때문에로 options: .easeInOut변경하여 .transitionCrossDissolve 일했습니다.
LeoGalante

13

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

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

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

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


9

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


7

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

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()

6

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

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

0

UIView를 레이블 아래에 배치하고 불투명도를 애니메이션하는 것이 매우 쉽습니다. 해당보기에 레이블을 추가해야합니다. 리소스 소비 관점에서 볼 때 좋은 솔루션은 아니지만 매우 간단합니다.


0

업데이트 된 스위프트 3.0

@budidino 댓글에서 방금 변경했습니다.

UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil)

0

@ Strange 의 답변에 감사드립니다. Swift 5, Xcode 11에서 약간의 구문 변경으로 완벽하게 작동합니다. 여러 UILabels의 텍스트 색상을 애니메이션으로 만들었습니다. 이것이 귀하의 경우라면 이것을 시도하십시오.

for label in [label1, label2, ...] as [UILabel] { // loop through a @IBOutlet UILabel array
        UIView.transition(with: label, duration: 0.3, options: .transitionCrossDissolve, animations: {
            label.textColor = .label
        }, completion: nil)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.