[ios] UILabel에서 애니메이션 텍스트 변경

새 텍스트 값을로 설정하고 UILabel있습니다. 현재 새 텍스트는 잘 나타납니다. 그러나 새 텍스트가 나타날 때 애니메이션을 추가하고 싶습니다. 새 텍스트의 모양에 애니메이션을 적용하기 위해 무엇을 할 수 있는지 궁금합니다.



답변

그것이 작동하는지 궁금하고 완벽하게 작동합니다!

목표 -C

[UIView transitionWithView:self.label 
                  duration:0.25f 
                   options:UIViewAnimationOptionTransitionCrossDissolve 
                animations:^{

    self.label.text = rand() % 2 ? @"Nice nice!" : @"Well done!";

  } completion:nil];

스위프트 3, 4, 5

UIView.transition(with: label,
              duration: 0.25,
               options: .transitionCrossDissolve,
            animations: { [weak self] in
                self?.label.text = (arc4random()() % 2 == 0) ? "One" : "Two"
         }, completion: nil)


답변

목표 -C

진정한 교차 디졸브 전환 ( 새 레이블 페이드 인 동안 이전 레이블 페이드 아웃) 을 달성하려면 페이드가 보이지 않게하고 싶지 않습니다. 그것은 초래 텍스트가 변경되지 않은 경우에도 원치 않는 깜박임 .

대신이 방법을 사용하십시오.

CATransition *animation = [CATransition animation];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.type = kCATransitionFade;
animation.duration = 0.75;
[aLabel.layer addAnimation:animation forKey:@"kCATransitionFade"];

// This will fade:
aLabel.text = "New"

참조 :
애니메이션 UILabel의 텍스트 두 숫자 사이?

iOS 10, 9, 8 시연

공백, 1-5 페이드 전환


테스트 엑스 코드 8.2.1 및 7.1 , 오브젝티브 -c8.0으로 아이폰 OS (10) .

► 전체 프로젝트를 다운로드하려면 Swift Recipes 에서 SO-3073520 을 검색하십시오 .


답변

스위프트 4

UILabel (또는 그 문제에 대한 UIView)을 페이드하는 올바른 방법은을 사용하는 것 Core Animation Transition입니다. 내용이 바뀌지 않으면 깜박 거리지 않으며 검은 색으로 사라지지 않습니다.

휴대 가능하고 깨끗한 솔루션은 ExtensionSwift에서 사용하는 것 입니다 (표시 요소를 변경하기 전에 호출)

// Usage: insert view.fadeTransition right before changing content


extension UIView {
    func fadeTransition(_ duration:CFTimeInterval) {
        let animation = CATransition()
        animation.timingFunction = CAMediaTimingFunction(name:
            CAMediaTimingFunctionName.easeInEaseOut)
        animation.type = CATransitionType.fade
        animation.duration = duration
        layer.add(animation, forKey: CATransitionType.fade.rawValue)
    }
}

호출은 다음과 같습니다 :

// This will fade
aLabel.fadeTransition(0.4)
aLabel.text = "text"

공백, 1-5 페이드 전환


GitHub 에서이 솔루션을 찾고 스위프트 레시피 에 대한 추가 세부 사항을 찾으십시오 .


답변

iOS4부터 블록으로 분명히 할 수 있습니다.

[UIView animateWithDuration:1.0
                 animations:^{
                     label.alpha = 0.0f;
                     label.text = newText;
                     label.alpha = 1.0f;
                 }];


답변

이 작업을 수행하는 코드는 다음과 같습니다.

[UIView beginAnimations:@"animateText" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1.0f];
[self.lbl setAlpha:0];
[self.lbl setText:@"New Text";
[self.lbl setAlpha:1];
[UIView commitAnimations];


답변

UILabel 확장 솔루션

extension UILabel{

  func animation(typing value:String,duration: Double){
    let characters = value.map { $0 }
    var index = 0
    Timer.scheduledTimer(withTimeInterval: duration, repeats: true, block: { [weak self] timer in
        if index < value.count {
            let char = characters[index]
            self?.text! += "\(char)"
            index += 1
        } else {
            timer.invalidate()
        }
    })
  }


  func textWithAnimation(text:String,duration:CFTimeInterval){
    fadeTransition(duration)
    self.text = text
  }

  //followed from @Chris and @winnie-ru
  func fadeTransition(_ duration:CFTimeInterval) {
    let animation = CATransition()
    animation.timingFunction = CAMediaTimingFunction(name:
        CAMediaTimingFunctionName.easeInEaseOut)
    animation.type = CATransitionType.fade
    animation.duration = duration
    layer.add(animation, forKey: CATransitionType.fade.rawValue)
  }

}

에 의해 간단히 호출 된 기능

uiLabel.textWithAnimation(text: "text you want to replace", duration: 0.2)

모든 팁을 주셔서 감사합니다. 이것이 장기적으로 도움이되기를 바랍니다.


답변

위의 SwiftArchitect 솔루션의 Swift 4.2 버전은 훌륭합니다.

    // Usage: insert view.fadeTransition right before changing content    

extension UIView {

        func fadeTransition(_ duration:CFTimeInterval) {
            let animation = CATransition()
            animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
            animation.type = CATransitionType.fade
            animation.duration = duration
            layer.add(animation, forKey: CATransitionType.fade.rawValue)
        }
    }

기도:

    // This will fade

aLabel.fadeTransition(0.4)
aLabel.text = "text"