Ios 在UILabel中设置文本更改动画

Ios 在UILabel中设置文本更改动画,ios,objective-c,ipad,uilabel,caanimation,Ios,Objective C,Ipad,Uilabel,Caanimation,我正在将新文本值设置为UILabel。目前,新文本看起来很好。但是,我想在新文本出现时添加一些动画。我想知道我能做些什么来为新文本的外观设置动画 下面是使这项工作正常的代码 [UIView beginAnimations:@"animateText" context:nil]; [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; [UIView setAnimationDuration:1.0f]; [self.lbl setAlpha:

我正在将新文本值设置为
UILabel
。目前,新文本看起来很好。但是,我想在新文本出现时添加一些动画。我想知道我能做些什么来为新文本的外观设置动画

下面是使这项工作正常的代码

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

由于iOS4,显然可以使用块来完成:

[UIView animateWithDuration:1.0
                 animations:^{
                     label.alpha = 0.0f;
                     label.text = newText;
                     label.alpha = 1.0f;
                 }];
目标-C 要实现true交叉融合过渡(旧标签淡出,而新标签淡入),您不希望淡入不可见。即使文本保持不变,也会导致不必要的闪烁

改用这种方法:

cattransition*animation=[cattransition animation];
animation.timingFunction=[CamediaTimingFunctionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.type=kCATransitionFade;
animation.duration=0.75;
[aLabel.layer addAnimation:animation forKey:@“kCATransitionFade”];
//这将逐渐消失:
aLabel.text=“新建”
另见:

在iOS 10、9、8中演示:

UIView.transitionWithView(self.view, duration: 1.0, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: {
    self.sampleLabel.text = "Animation Fade1"
    }, completion: { (finished: Bool) -> () in
        self.sampleLabel.text = "Animation Fade - 34"
})


在iOS 10至8.0上使用Xcode 8.2.1和7.1、ObjectiveC进行测试


► 要下载完整的项目,请在中搜索。

我想知道它是否有效,而且效果非常好

目标-C

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

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

  } completion:nil];
Swift 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)
斯威夫特4 淡入UILabel(或任何UIView)的正确方法是使用
核心动画过渡
。这不会闪烁,如果内容不变,也不会褪色为黑色

可移植且干净的解决方案是在Swift中使用
扩展名
(在更改可见元素之前调用)

//用法:在更改内容之前插入view.fadeTransition
扩展UIView{
func fadeTransition(uu持续时间:CFTimeInterval){
让动画=CATTransition()
animation.timingFunction=CAMediaTimingFunction(名称:
CamediaTimeingFunctionName.easeInEaseOut)
animation.type=CatTransitionType.fade
animation.duration=持续时间
添加(动画,forKey:cattransitionType.fade.rawValue)
}
}
调用如下所示:

//这将淡出
阿拉贝尔衰减转换(0.4)
aLabel.text=“text”



► 请在上查找此解决方案,并在上查找其他详细信息。

Swift 2.0:

UIView.transitionWithView(self.view, duration: 1.0, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: {
    self.sampleLabel.text = "Animation Fade1"
    }, completion: { (finished: Bool) -> () in
        self.sampleLabel.text = "Animation Fade - 34"
})


如果您想在
Swift
中延迟执行此操作,请尝试以下操作:

delay(1.0) {
        UIView.transitionWithView(self.introLabel, duration: 0.25, options: [.TransitionCrossDissolve], animations: {
            self.yourLabel.text = "2"
            }, completion:  { finished in

                self.delay(1.0) {
                    UIView.transitionWithView(self.introLabel, duration: 0.25, options: [.TransitionCrossDissolve], animations: {
                        self.yourLabel.text = "1"
                        }, completion:  { finished in

                    })
                }

        })
    }
使用@matt-创建的以下函数:

在Swift 3中会变成这样

func delay(_ delay:Double, closure:()->()) {
    let when = DispatchTime.now() + delay
    DispatchQueue.main.after(when: when, execute: closure)
}
这是一种基于@SwiftArchitect代码的C#UIView扩展方法。当涉及自动布局且控件需要根据标签的文本移动时,此调用代码使用标签的Superview作为转换视图,而不是标签本身。我为动作添加了一个lambda表达式,以使其更加封装

public static void FadeTransition( this UIView AView, double ADuration, Action AAction )
{
  CATransition transition = new CATransition();

  transition.Duration = ADuration;
  transition.TimingFunction = CAMediaTimingFunction.FromName( CAMediaTimingFunction.Linear );
  transition.Type = CATransition.TransitionFade;

  AView.Layer.AddAnimation( transition, transition.Type );
  AAction();
}
呼叫代码:

  labelSuperview.FadeTransition( 0.5d, () =>
  {
    if ( condition )
      label.Text = "Value 1";
    else
      label.Text = "Value 2";
  } );

使用Swift 5,您可以从以下两个游乐场代码示例中选择一个,以便使用交叉溶解动画来设置
UILabel
文本更改的动画


#1.使用
UIView
的类方法
#2.使用和
CALayer
的方法
上述SwiftArchitect解决方案的Swift 4.2版本(非常有效):

调用:

    // This will fade

aLabel.fadeTransition(0.4)
aLabel.text = "text"
Swift 4.2解决方案(采用4.0回答并更新新枚举以进行编译)


实现这一点还有一个解决方案。它被描述了。其思想是子类化
UILabel
并以以下方式重写
操作(for:forKey:)
函数:

class LabelWithAnimatedText:UILabel{
覆盖变量文本:字符串{
迪塞特{
self.layer.setValue(self.text,forKey:“text”)
}
}
覆盖func操作(对于层:CALayer,forKey事件:String)->CAAction{
如果事件==“文本”{
如果let action=self.action(对于:layer,forKey:“backgroundColor”)作为动画{
let transition=cattransition()
transition.type=kCATransitionFade
//摄像属性
transition.beginTime=action.beginTime
transition.duration=action.duration
transition.speed=action.speed
transition.timeOffset=action.timeOffset
transition.repeatCount=action.repeatCount
transition.repeatDuration=action.repeatDuration
transition.autoreverses=action.autoreverses
transition.fillMode=action.fillMode
//动画属性
transition.timingFunction=action.timingFunction
transition.delegate=action.delegate
返回转换
}
}
返回super.action(for:layer,forKey:event)
}
}
用法示例:

//不要忘记将“Custom Class”IB属性设置为“LabelWithAnimatedText”
//@ibvar myLabel:LabelWithAnimatedText!
// ...
UIView.animate(持续时间:0.5){
myLabel.text=“我已被激活!”
}
myLabel.text=“我没有动画!”

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

}

谢谢你们给我的提示。希望这将有助于长期

系统默认值为0.25的
持续时间
和.curveEaseInEaseOut的
计时功能
通常更适合于动画的一致性,可以省略:

let animation = CATransition()
label.layer.add(animation, forKey: nil)
label.text = "New text"
这与写这篇文章是一样的:

let animation = CATransition()
animation.duration = 0.25
animation.timingFunction = .curveEaseInEaseOut
label.layer.add(animation, forKey: nil)
label.text = "New text"

当我同时设置两个标签时,它会在模拟器上闪烁。可能是误用了吗?我的方法的要点是不使用2个标签。您使用单个标签,
-addAnimation:forKey
,然后更改标签的文本。@ConfusedVorlon,请验证您的声明。并对照张贴在上的项目进行检查。我可能在过去对此有错误的理解。我想你可以定义transi
    // This will fade

aLabel.fadeTransition(0.4)
aLabel.text = "text"
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)
    }
}

func updateLabel() {
myLabel.fadeTransition(0.4)
myLabel.text = "Hello World"
}
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)
let animation = CATransition()
label.layer.add(animation, forKey: nil)
label.text = "New text"
let animation = CATransition()
animation.duration = 0.25
animation.timingFunction = .curveEaseInEaseOut
label.layer.add(animation, forKey: nil)
label.text = "New text"