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

Posted

技术标签:

【中文标题】如何制作具有动态变化和循环文本的 UILabel?【英文标题】:How do I make a UILabel with dynamically changing and looping text? 【发布时间】:2016-06-15 06:25:55 【问题描述】:

我想制作一个文本从“加载”->“加载”更改的标签。 ->“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"
        
    

【问题讨论】:

你可以使用 NSTimer。安排一个以 2 或 3 秒为间隔重复的计时器。 developer.apple.com/library/mac/documentation/Cocoa/Reference/… 啊,这真是个好主意!我会去做的。谢谢。 你能在这里添加一点代码吗? 当然!我会将其作为评论添加到我选择作为解决方案和编辑的答案中。 【参考方案1】:

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

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

【讨论】:

所以我使用了这个答案,我使用它的方式是创建一个在一定间隔内重复的计时器,每次重复时,它都会运行一个选择器,在这种情况下是@987654322 @。有关代码细节,请参阅我的编辑【参考方案2】:

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

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

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 = @"";
    


【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

pod MarqueeLabel

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

@IBOutlet weak var lblLocation: MarqueeLabel!

根据您的要求设置属性:

    持续时间 渐变长度 选框类型

【讨论】:

以上是关于如何制作具有动态变化和循环文本的 UILabel?的主要内容,如果未能解决你的问题,请参考以下文章

具有比例宽度和文本驱动高度的动态 UILabel

多个 UILabel 实例

如何根据宽度有限的文本更改 UILabel 大小

为它后面的 UIViews 制作一个 UILabel 块触摸事件

当视图宽度发生变化时,如何使 UILabel 正确调整其尺寸?

iOS 10中的UILabel,制作文字字体