如何制作具有动态变化和循环文本的 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 秒的计时器,该计时器会重复。
MarqueeLabel 只需稍作修改即可帮助您实现这一目标。要么将 Loading 文本设为不同的标签,将 DOTS 文本设为 MarqueeLabel,要么完全将所有三个点设为不同的标签,分别隐藏和取消隐藏它们.后者是一种非常繁琐的方法,非常不推荐,因此优先使用。
pod MarqueeLabel
MarqueeLabel 提供此功能。只需将标签的 class 名称设置为 MarqueeLabel 为:
@IBOutlet weak var lblLocation: MarqueeLabel!
根据您的要求设置属性:
- 时长
- 淡化长度
- 选取框类型
复制并粘贴到您的项目中并更改计时器和秒的值
当你想要文本动画时启动计时器,当不使用时停止
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()
}
我想创建一个标签,其文本从 "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 秒的计时器,该计时器会重复。
MarqueeLabel 只需稍作修改即可帮助您实现这一目标。要么将 Loading 文本设为不同的标签,将 DOTS 文本设为 MarqueeLabel,要么完全将所有三个点设为不同的标签,分别隐藏和取消隐藏它们.后者是一种非常繁琐的方法,非常不推荐,因此优先使用。
pod MarqueeLabel
MarqueeLabel 提供此功能。只需将标签的 class 名称设置为 MarqueeLabel 为:
@IBOutlet weak var lblLocation: MarqueeLabel!
根据您的要求设置属性:
- 时长
- 淡化长度
- 选取框类型
复制并粘贴到您的项目中并更改计时器和秒的值
当你想要文本动画时启动计时器,当不使用时停止
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()
}