class ViewController: UIViewController {
let manImage = UIImage(named: "man.png")
let buttons = (0..<5).map({_ in UIButton()})
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
createButtons()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func createButtons() {
var pos = 25
for index in 0...4 {
delay(Double(arc4random_uniform(5)) + 5) {
self.buttons[index].setBackgroundImage(self.manImage, forState: .Normal)
self.buttons[index].translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(self.buttons[index])
self.view.addConstraint(NSLayoutConstraint(
item: self.buttons[index],
attribute: .Leading,
relatedBy: .Equal,
toItem: self.view,
attribute: .Leading,
multiplier: 1,
constant: CGFloat(pos)))
pos += 10
}
}
}
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
}
我一直在使用一堆不同的延时示例代码进行搜索,但所有代码都会导致某些按钮同时显示。从代码行
delay(Double(arc4random_uniform(5)) + 5)
这不意味着在for循环的每次迭代之间延迟至少5秒吗?为什么这样做?
谢谢。
答案 0 :(得分:1)
你的代码创建了四个随机长度的延迟,但它几乎同时创建它们并且并行运行它们,因此很可能一些随机延迟与其他延迟大致相同,并且按钮会出现同时显示。
你可能想尝试创建一个按钮,然后延迟一个随机时间,创建另一个按钮,然后再延迟等等。不同之处在于你应该在按钮创建之间创建一个随机延迟,而不是创建所有四个立即延误。递归函数适用于此。
请注意不要在延迟期间阻止主线程。上述代码在这方面看起来是正确的,但在这件事上仍然要小心。
答案 1 :(得分:1)
类似于原始方法的解决方案可能是使每个连续按钮的延迟相对于前一个按钮。
func createButtons() {
var delayTime = 0.0
var pos = 25
for index in 0...4 {
delayTime = delayTime + Double(arc4random_uniform(5)) + 5
delay(delayTime) {
self.buttons[index].setBackgroundImage(self.manImage, forState: .Normal)
self.buttons[index].translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(self.buttons[index])
self.view.addConstraint(NSLayoutConstraint(
item: self.buttons[index],
attribute: .Leading,
relatedBy: .Equal,
toItem: self.view,
attribute: .Leading,
multiplier: 1,
constant: CGFloat(pos)))
pos += 10
}
}
}