Сначала добавьте обработчик завершения к blink
, потому что мы начнем следующий миг после того, как закончится предыдущий миг.
extension UIButton {
func blink(completion: @escaping () -> Void) {
self.alpha = 0.0;
UIView.animate(withDuration: 0.6, //Time duration you want,
delay: 0.0,
options: [.curveEaseInOut],
animations: { self.alpha = 1.0 },
completion: { _ in
UIView.animate(withDuration: 0.6,
delay: 0.0,
options: [.curveEaseInOut],
animations: { self.alpha = 0.0 },
completion: { _ in completion() })
})
}
}
Затем напишите функцию, которая принимает [Block]
и индекс, который мигает кнопкой на этом индексе. Обратите внимание, как я передаю замыкание, которое вызывает blink(at:in:)
снова, как завершение blink()
вызовов:
func blink(at index: Int, in signals: [Block]) {
guard index < signals.count else { return }
let completion = { blink(at: index + 1, in: signals) }
switch (signals[index]) {
case .green: green.blink(completion: completion)
case .red: red.blink(completion: completion)
case .yellow: yellow.blink(completion: completion)
case .blue: blue.blink(completion: completion)
}
}
Теперь мы можем переписать giveSignal
:
func giveSignal() {
disableButton()
signals = []
for _ in 0...levelNum {
let randomSignal:Int = randomSource.nextInt(upperBound: 4)
switch randomSignal {
//Green
case 0:
signals.append(Block.green)
//Red
case 1:
signals.append(Block.red)
//Yellow
case 2:
signals.append(Block.yellow)
//Blue
case 3:
signals.append(Block.blue)
default:
break
}
}
blink(at: 0, in: signals) // This starts the sequence of blinks
let finalSeq:String = makeString()
statusBar.text = finalSeq
}