У меня есть набор кнопок в виде стека. Каждая кнопка при нажатии воспроизводит другой звук. У меня есть отдельная кнопка (кнопка l oop), которая при нажатии вызывает функцию loopButtonPressed
. Моя цель состоит в том, чтобы при нажатии этой кнопки l oop она проходила через l oop через подпредставления, являющиеся кнопками в этом виде стека, и последовательно воспроизводила каждый из звуков в порядке, используя функцию soundButtonPressed
. Я видел метод, который я реализовал ниже, используя функцию run()
, которая устанавливает каждую последующую функцию для запуска через определенный промежуток времени. Хотя этот вид работ не является хорошим решением, потому что звуковые файлы имеют разную длину. Я думал, что может быть способ сделать это с помощью групп рассылки, которые я не до конца понимаю. Если я уберу функцию запуска, она будет воспроизводить только звук последней кнопки в представлении стека. Я использую AVFoundation для воспроизведения файлов WAV, а также. Спасибо за любые советы и указания, спасибо.
func run(after seconds: Int, completion: @escaping () -> Void) {
let deadline = DispatchTime.now() + .milliseconds(seconds)
DispatchQueue.main.asyncAfter(deadline: deadline) {
completion()
}
}
@objc func loopButtonPressed(_ sender: UIButton) {
var i = 1
for case let button as UIButton in self.colorBubblesStackView.subviews {
run(after: 800*i) {
self.soundButtonPressed(sender: button)
}
i += 1
}
}
Моя функция soundButtonPressed - это просто оператор switch, в котором каждый случай вызывает функцию playSound()
с правильным именем звукового файла. Вот функция playSound:
func playSound(_ soundFileName: String) {
guard let url = Bundle.main.url(forResource: soundFileName, withExtension: "wav") else { return }
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)
player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue)
guard let player = player else { return }
player.play()
} catch let error {
print(error.localizedDescription)
}
}