如何制作具有动态变化和循环文本的 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?的主要内容,如果未能解决你的问题,请参考以下文章
为它后面的 UIViews 制作一个 UILabel 块触摸事件