如何制作具有动态变化和循环文本的 UILabel?

How do I make a UILabel with dynamically changing and looping text?

我想创建一个标签,其文本从 "Loading" -> "Loading." ->"Loading.." -> "Loading..." 动态变化,只要该标签存在.

所以我刚刚创建了一个标签并添加了一个我称之为 animateDots 的函数,它一直在调用自己。我使用 UIView.animateWithDuration() 完成了它,每个完成块调用另一个 animateWithDuration() 直到它只调用 animateDots() 等等。但这没有用,因为 UILabel 中的文本不可设置动画,所以它只能非常快速地设置所有四个标签的动画。我希望它慢一点。

我尝试了 UIView.preformWithoutAnimation,我也尝试了 UIView.beginAnimations,但我无法回忆起 animateDots() 而不导致应用程序崩溃。我不知道还能尝试什么

编辑:感谢@7vikram7 的建议,我是这样解决的。

我在初始化标签后立即创建了计时器,并且计时器重复。每次计时器完成一个循环时,它都会运行一个选择器,在本例中为 animateDots,它会更改文本。在代码中:

每当你想开始动画过程时添加这个:

loading = UILabel(frame: CGRectMake(0,0,80,50))
loading.text = "Loading"
let timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector:
            #selector(LoadingCell.animateDots), userInfo: nil, repeats: true)
        timer.fire()

然后添加这个函数:

func animateDots() {
        switch (loading.text!) {
        case "Loading...":
            loading.text = "Loading"
        case "Loading":
            loading.text = "Loading."
        case "Loading.":
            loading.text = "Loading.."
        case "Loading..":
            loading.text = "Loading..."
        default:
            loading.text = "Loading"
        }
    }

您也可以创建 4 个这样的图像,并且可以为 uiimageview 设置动画。它给出了与您想要的相同的结果。

您可以使用 NSTimer。安排一个间隔为 2 或 3 秒的计时器,该计时器会重复。

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/

MarqueeLabel 只需稍作修改即可帮助您实现这一目标。要么将 Loading 文本设为不同的标签,将 DOTS 文本设为 MarqueeLabel,要么完全将所有三个点设为不同的标签,分别隐藏和取消隐藏它们.后者是一种非常繁琐的方法,非常不推荐,因此优先使用。

pod MarqueeLabel

MarqueeLabel 提供此功能。只需将标签的 class 名称设置为 MarqueeLabel 为:

@IBOutlet weak var lblLocation: MarqueeLabel!

根据您的要求设置属性:

  1. 时长
  2. 淡化长度
  3. 选取框类型

复制并粘贴到您的项目中并更改计时器和秒的值

当你想要文本动画时启动计时器,当不使用时停止

NSTimer *myticker = [NSTimer scheduledTimerWithTimeInterval:(set your time) target:self selector:@selector(showActivity) userInfo:nil repeats:YES];

-(void)showActivity {

    second=second-0.5; // set your second

    if (second <= 0) {
        [myticker invalidate];

    }


    if (second >= 5) {
        if ([connectingLabel.text isEqualToString:@"Connecting."]) {
            connectingLabel.text = @"Connecting..";

        }else  if ([connectingLabel.text isEqualToString:@"Connecting.."]) {
            connectingLabel.text = @"Connecting...";

        }else if ([connectingLabel.text isEqualToString:@"Connecting..."]) {
            connectingLabel.text = @"Connecting.";
        }else{
            connectingLabel.text = @"Connecting.";

        }
    }else{
        connectingLabel.text = @"";
    }

}

Swift 5版Wos答案

    var myticker : Timer?
func LabelAnimating() {
    myticker  = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(showLoading), userInfo: nil, repeats: true)
}

@objc func showLoading() {

    if findingTripsLbl.text == "Connecting." {
        findingTripsLbl.text = "Connecting.."
    } else if findingTripsLbl.text == "Connecting.." {
        findingTripsLbl.text = "Connecting..."
    } else if findingTripsLbl.text == "Connecting..." {
        findingTripsLbl.text = "Connecting."
    } else {
        findingTripsLbl.text = "Connecting."
    }}

func StopLoading()  {
         myticker?.invalidate()
}