UI 레이블의 textColor 속성을 애니메이션화하는 방법은 무엇입니까?
어떤 이유에서인지, 제가 애니메이션을 하려고 할 때textColor
안 될 거예요.textColor
갑자기 A에서 B로 바뀝니다.예를 들어 빨간색에서 검은색으로 애니메이션을 만드는 것이 가능합니까?
대신 이렇게 개체 자체에 크로스페이드 전환을 사용해 본 적이 있다면 한 색상에서 다른 색상으로 페이드인 페이드아웃 효과를 얻을 수 있습니다.
목표 C
[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];
스위프트 5
UIView.transition(with: creditsLabel, duration: 0.25, options: .transitionCrossDissolve) {
self.creditsLabel.textColor = .red
}
이것은 다양한 이유로 NSTimers, CATextLayer 등을 사용하는 것보다 더 좋습니다.CATextLayer가 텍스트 키닝 또는 NSA 속성을 제대로 지원하지 않습니다.텍스트 및 NSTimers가 지연됩니다(그리고 코드가 너무 많습니다).위의 전환 애니메이션은 유용하며, 체인 애니메이션에서도 사용할 수 있습니다.저는 같은 문제를 가지고 있었고 위의 해결책을 이미 시도했지만, 이 간단한 코드는 대신에 놀라운 작동을 합니다.
Swift 4 솔루션:
UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.yourLabel.textColor = .red
}, completion: nil)
textColor를 애니메이션화할 수 없는 이유는 UILabel이 CATextLayer 대신 일반 CALayer를 사용하기 때문입니다.
textColor를 애니메이션으로 만들 수 있도록(텍스트, 글꼴 등) UI 레이블을 하위 분류하여 CATextLayer를 사용하도록 할 수 있습니다.
이것은 꽤 많은 일이지만, 운 좋게도 나는 이미 그것을 했습니다 :-)
이 문서에서 UI 레이블에 대한 전체 설명 + 드롭인 오픈 소스 대체 기능을 찾을 수 있습니다.
텍스트Color가 있는 UI 레이블의 다른 인스턴스나 다른 인스턴스를 만든 다음 두 인스턴스(이전 textColor가 있는 인스턴스와 새 textColor가 있는 인스턴스) 사이에 애니메이션을 적용할 수 있습니다.
이것이 저에게 유일하게 효과가 있었습니다.
let changeColor = CATransition()
changeColor.duration = 1
CATransaction.begin()
CATransaction.setCompletionBlock {
selected.label.layer.add(changeColor, forKey: nil)
selected.label.textColor = .black
}
selected.nameLabel.textColor = .red
CATransaction.commit()
이 대답은 구식이며 원래 질문에 대한 좋은 해결책이 아닙니다.@아래의 답변이 훨씬 더 좋으므로 다음 답변 대신 사용해야 합니다. https://stackoverflow.com/a/20892927/76559
//아래의 이전 답변
그textColor
속성이 문서에 애니메이션으로 지정되어 있지 않기 때문에 간단한 UIView 애니메이션 블록으로는 할 수 없을 것 같습니다...
이것은 아마도 꽤 조잡하게 할 수 있을 것입니다.NSTimer
2~3밀리초마다 발사되며, 매번 하나에서 다른 하나로 점진적으로 색상을 설정합니다.
저는 이것이 조잡하다고 생각합니다. 왜냐하면 이것은 시작 색상에서 결승 색상까지 미리 설정된 색상 값의 배열이나 다른 용기를 필요로 하기 때문입니다. 그리고 저는 당신이 코어 애니메이션 같은 것을 사용하여 이것을 할 수 있는 방법이 있다고 확신합니다. 저는 그것이 무엇인지 모릅니다.
여기 레이블 텍스트 색상을 애니메이션화하는 코드가 있습니다.중요한 부분은 애니메이션 전에 textColor를 clearColor로 설정하는 것입니다.
label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
저는 UIV 뷰를 레이블 아래에 배치하고 불투명도를 애니메이션화하는 것이 꽤 쉽다는 것을 알았습니다.레이블을 해당 보기에 추가해야 합니다.자원 소비의 관점에서 볼 때 좋은 해결책은 아닐 수도 있지만, 꽤 간단합니다.
업데이트됨 swift 3.0
방금 @budidino 댓글에서 변경했습니다.
UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil)
스위프트 5, Xcode 11에서 완벽하게 작동하며 비트 구문이 변경된 @Strange의 답변에 감사드립니다.여러 UILabel에 대한 텍스트 색상을 애니메이션화하고 있었습니다. 이것도 당신의 경우라면, 이것을 시도해 보십시오.
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)
}
코어 애니메이션을 사용해 보십시오.
func textColorBlinking(){
let changeColor = CATransition()
changeColor.duration = 1
changeColor.type = .fade
changeColor.repeatCount = Float.infinity
CATransaction.begin()
CATransaction.setCompletionBlock {
self.lblHome.layer.add(changeColor, forKey: nil)
self.lblHome.textColor = .white
}
self.lblHome.textColor = .red
CATransaction.commit()
}
언급URL : https://stackoverflow.com/questions/2426614/how-to-animate-the-textcolor-property-of-an-uilabel
'programing' 카테고리의 다른 글
Git 태그를 재생성한 후 "태그가 원격에 이미 있습니다" 오류가 발생했습니다. (0) | 2023.09.04 |
---|---|
최신 타임스탬프별 MySQL 선택 (0) | 2023.09.04 |
Docker 명령의 --net=host 옵션은 실제로 무엇을 합니까? (0) | 2023.09.04 |
select2 - 검색 상자 숨기기 (0) | 2023.08.15 |
Div 높이가 100%이고 내용에 맞게 확장됩니다. (0) | 2023.08.15 |