Swift4:延迟...循环结果
Swift4: Delay for...loop results
我有一个应用程序可以随机抽取名字,然后以 3 或 4 个为一组显示它们。
一切都很好,但我想延迟输出(增加悬念)
我们目前得到 "Group 1 consists of Fred, Dave, Steve, John"
我们想看"Group 1 consists of .(pause).....Fred...(pause)......Dave..(pause)......Steve....(pause).....John"
我已经试过了Sleep(x)
,但这似乎被忽略了。
这是我的简单循环:
玩家存储在数组playing
中。
G1
可以是 1 到 4 之间的任何值。
Gr1Text
是一个文本框。
for i in 0...G1-1 {
G1Text = (G1Text ?? "") + playing[i] + " , "
self.Gr1Text.text = G1Text}
}
只需要在显示名称之间暂停一下
谢谢
所以我创建了一些代码来使用动画删除名称
func dropText(_ sender: String)
{
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = sender
label.font = UIFont.systemFont(ofSize: 32, weight: .bold)
label.textColor = UIColor.white
view.addSubview(label)
var yAnchor = label.centerYAnchor.constraint(equalTo: view.topAnchor, constant: -200)
yAnchor.isActive = true
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
yAnchor.isActive = false
yAnchor = label.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: 200)
yAnchor.isActive = true
UIView.animate(withDuration: 1, delay: 1, usingSpringWithDamping: 0.5, initialSpringVelocity:5, options: .curveEaseIn, animations: {
self.view.layoutIfNeeded()
})
}
但我还是不知道如何在名字之间停顿。如果我使用 for .. 循环来调用此函数,它只会同时运行它们吗?
谢谢
Just need a pause between displaying the names
首先 select 分组可能更容易,然后再考虑如何按您喜欢的方式显示它们。拥有组后,您可以使用计时器来安排每个名称的显示。如果你不想那样做,那么你仍然应该使用一个计时器,只是 select 下一个名称并一步显示它,然后启动另一个计时器 select 并显示下一个,依此类推。
使用循环延迟的 for
循环是一个糟糕的计划,因为这意味着您的程序不能做任何其他事情,至少在那个线程上,直到整个过程完成。应用程序通常在后台进行很多操作,因此以这种方式阻塞主线程是非常糟糕的事情。
Makes sense, but when you say use a timer... what timer method?
任何适合你的。例如,您可以使用 scheduledTimer(withTimeInterval:repeats:block:)
,并将其设置为每秒重复一次,直到完成。或者你可以让它只触发一次,但在当前定时器触发时启动一个新定时器——这样你就可以使用不同的时间间隔,这样用户就不知道下一个名字出现的确切时间。
另一种方法是使用 Core Animation 并将名字动画显示在屏幕上——它可以是一个单独的长动画,显示所有名字之间有延迟,或者是安排在不同时间的一系列动画。使用动画可以让您以一种有趣的方式显示名称...它们可以淡入,或从屏幕外滑入,或者似乎落在屏幕上并有一点弹跳,等等。
我找到了使用
的解决方案
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {}
这非常适合延迟。
您可以使用相同的标签并修改标签内的文本。对于中间暂停,您可以使用计时器。
func addNamesWithDelay(){
let friendsName = ["aaa","bbb","ccc","ddd","eee"]
var nameCnt = 0
var finalStr = "Group 1 has "
Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { (timer) in
let randomNumber = Int.random(in: 0...4) // total 5 players
if nameCnt == 2 { // assuming one group has 3 players
timer.invalidate()
}
finalStr = finalStr + friendsName[randomNumber] + (nameCnt == 3 ? "" : " ,")
self.lbl.text = finalStr
nameCnt += 1
}
}
我有一个应用程序可以随机抽取名字,然后以 3 或 4 个为一组显示它们。 一切都很好,但我想延迟输出(增加悬念) 我们目前得到 "Group 1 consists of Fred, Dave, Steve, John"
我们想看"Group 1 consists of .(pause).....Fred...(pause)......Dave..(pause)......Steve....(pause).....John"
我已经试过了Sleep(x)
,但这似乎被忽略了。
这是我的简单循环:
玩家存储在数组playing
中。
G1
可以是 1 到 4 之间的任何值。
Gr1Text
是一个文本框。
for i in 0...G1-1 {
G1Text = (G1Text ?? "") + playing[i] + " , "
self.Gr1Text.text = G1Text}
}
只需要在显示名称之间暂停一下
谢谢
所以我创建了一些代码来使用动画删除名称
func dropText(_ sender: String)
{
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = sender
label.font = UIFont.systemFont(ofSize: 32, weight: .bold)
label.textColor = UIColor.white
view.addSubview(label)
var yAnchor = label.centerYAnchor.constraint(equalTo: view.topAnchor, constant: -200)
yAnchor.isActive = true
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
yAnchor.isActive = false
yAnchor = label.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: 200)
yAnchor.isActive = true
UIView.animate(withDuration: 1, delay: 1, usingSpringWithDamping: 0.5, initialSpringVelocity:5, options: .curveEaseIn, animations: {
self.view.layoutIfNeeded()
})
}
但我还是不知道如何在名字之间停顿。如果我使用 for .. 循环来调用此函数,它只会同时运行它们吗?
谢谢
Just need a pause between displaying the names
首先 select 分组可能更容易,然后再考虑如何按您喜欢的方式显示它们。拥有组后,您可以使用计时器来安排每个名称的显示。如果你不想那样做,那么你仍然应该使用一个计时器,只是 select 下一个名称并一步显示它,然后启动另一个计时器 select 并显示下一个,依此类推。
使用循环延迟的 for
循环是一个糟糕的计划,因为这意味着您的程序不能做任何其他事情,至少在那个线程上,直到整个过程完成。应用程序通常在后台进行很多操作,因此以这种方式阻塞主线程是非常糟糕的事情。
Makes sense, but when you say use a timer... what timer method?
任何适合你的。例如,您可以使用 scheduledTimer(withTimeInterval:repeats:block:)
,并将其设置为每秒重复一次,直到完成。或者你可以让它只触发一次,但在当前定时器触发时启动一个新定时器——这样你就可以使用不同的时间间隔,这样用户就不知道下一个名字出现的确切时间。
另一种方法是使用 Core Animation 并将名字动画显示在屏幕上——它可以是一个单独的长动画,显示所有名字之间有延迟,或者是安排在不同时间的一系列动画。使用动画可以让您以一种有趣的方式显示名称...它们可以淡入,或从屏幕外滑入,或者似乎落在屏幕上并有一点弹跳,等等。
我找到了使用
的解决方案DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {}
这非常适合延迟。
您可以使用相同的标签并修改标签内的文本。对于中间暂停,您可以使用计时器。
func addNamesWithDelay(){
let friendsName = ["aaa","bbb","ccc","ddd","eee"]
var nameCnt = 0
var finalStr = "Group 1 has "
Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { (timer) in
let randomNumber = Int.random(in: 0...4) // total 5 players
if nameCnt == 2 { // assuming one group has 3 players
timer.invalidate()
}
finalStr = finalStr + friendsName[randomNumber] + (nameCnt == 3 ? "" : " ,")
self.lbl.text = finalStr
nameCnt += 1
}
}