Как добавить задержку для звука, воспроизводимого с помощью swift - PullRequest
0 голосов
/ 12 января 2020

Я быстрый новичок и работаю над учебным проектом (волшебный c 8 шарик), и мне удалось сделать следующее: - воспроизвести определенный c звук при нажатии кнопки «Спросить». - воспроизводить определенный c звук, когда для каждого из случайно выбранных изображений

Однако теперь звук, который должен воспроизводиться при каждом нажатии кнопки, воспроизводится только один раз, и с этого момента я слышу только отображаемые звуки с каждым изображением. Это потому, что я "застрял" в "если - еще" l oop? Или мне нужно отложить звуки, которые воспроизводятся для каждого изображения в массиве?

Большое спасибо за вашу помощь!

Вот мой код:

import UIKit
import AVFoundation

class ViewController: UIViewController {

    @IBOutlet weak var magicBall: UIImageView!

    var magicBallDisplay = 1
    var audioPlayer = AVAudioPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

      magicBall.image = #imageLiteral(resourceName: "theanswerisyes")

    }

    @IBAction func askButtonPressed(_ sender: UIButton) {

        let magicBallArray = [ #imageLiteral(resourceName: "askagainlater"),#imageLiteral(resourceName: "no"),#imageLiteral(resourceName: "theanswerisyes"),#imageLiteral(resourceName: "yes"),#imageLiteral(resourceName: "noidea")]
        magicBall.image = magicBallArray.randomElement()

        let soundURL = NSURL(fileURLWithPath: Bundle.main.path(forResource: "Ask", ofType: "wav")!)

        do{
            audioPlayer = try AVAudioPlayer(contentsOf: soundURL as URL)

        }catch {
            print("there was some error. The error was \(error)")
        }
        audioPlayer.play()

        if (magicBall.image?.isEqual(UIImage(named: "yes")))! {

            let soundURL = NSURL(fileURLWithPath: Bundle.main.path(forResource: "yes", ofType: "mp3")!)
            do{
            audioPlayer = try AVAudioPlayer(contentsOf: soundURL as URL)

            } catch {
            print("there was some error. The error was \(error)")
            }
             audioPlayer.play()
        }
        else if (magicBall.image?.isEqual(UIImage(named: "no")))! {
            let soundURL = NSURL(fileURLWithPath: Bundle.main.path(forResource: "no", ofType: "mp3")!)
        do{
        audioPlayer = try AVAudioPlayer(contentsOf: soundURL as URL)

        } catch {
        print("there was some error. The error was \(error)")
        }
         audioPlayer.play()
        }
        else if (magicBall.image?.isEqual(UIImage(named: "theanswerisyes")))! {
            let soundURL = NSURL(fileURLWithPath: Bundle.main.path(forResource: "theanswerisyes", ofType: "mp3")!)
        do{
        audioPlayer = try AVAudioPlayer(contentsOf: soundURL as URL)

        } catch {
        print("there was some error. The error was \(error)")
        }
         audioPlayer.play()
        }
        else if (magicBall.image?.isEqual(UIImage(named: "noidea")))! {
            let soundURL = NSURL(fileURLWithPath: Bundle.main.path(forResource: "noidea", ofType: "mp3")!)
        do{
        audioPlayer = try AVAudioPlayer(contentsOf: soundURL as URL)

        } catch {
        print("there was some error. The error was \(error)")
        }
         audioPlayer.play()
        }
        else if (magicBall.image?.isEqual(UIImage(named: "askagainlater")))! {
            let soundURL = NSURL(fileURLWithPath: Bundle.main.path(forResource: "askagainlater", ofType: "mp3")!)
        do{
        audioPlayer = try AVAudioPlayer(contentsOf: soundURL as URL)

        } catch {
        print("there was some error. The error was \(error)")
        }
         audioPlayer.play()
        }

    }

    }

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Я создаю новый проект и изменяю ваш код на это:

import UIKit
import AVFoundation

class ViewController: UIViewController {

    @IBOutlet weak var magicBall: UIImageView!
    // you never used this
    //var magicBallDisplay = 1
    var audioPlayer = AVAudioPlayer()
    override func viewDidLoad() {
        super.viewDidLoad()
        magicBall.image = #imageLiteral(resourceName: "theanswerisyes")
    }

    @IBAction func askButtonPressed(_ sender: UIButton) {
        // because you have audio file and image with equal name i made array of string
        let magicBallArray = [ "yes","no","theanswerisyes","noidea","askagainlater"]
        // check if i get not null item
        guard let choosedImageName = magicBallArray.randomElement() else {return}
        print(choosedImageName)
        // set image with random picked name
        magicBall.image = UIImage(named: choosedImageName)
        // play ask sound
        playSound(fileName: "Ask", fileType: "wav")
        // play picked image sound after 10 second from now()
        // change number to your needed time
        DispatchQueue.main.asyncAfter(deadline: .now() + 10.0, execute: {
            self.playSound(fileName: choosedImageName, fileType: "mp3")
        })
    }

    private func playSound(fileName: String, fileType: String)
    {
        // check if you find the audio file
        guard let url = Bundle.main.path(forResource: fileName, ofType: fileType) else {
            print("path not found")
            return
        }
        // make NSURL from path
        let soundURL = NSURL(fileURLWithPath: url)

        do{
            audioPlayer = try AVAudioPlayer(contentsOf: soundURL as URL)

        } catch {
            print("there was some error. The error was \(error)")
        }
        audioPlayer.play()
    }
}

Я объясняю код для вас. Я не включил кнопку. Вы можете улучшить этот код, когда вы стали сильнее в Swift

0 голосов
/ 12 января 2020

ваш код действительно грязный. сначала я советую вам сделать функцию воспроизведения звука:

func playSound(fileName: String, fileType: String) {

       let soundURL = NSURL(fileURLWithPath: Bundle.main.path(forResource: fileName,     ofType: fileType)!)

        do{
            audioPlayer = try AVAudioPlayer(contentsOf: soundURL as URL)

        }catch {
            print("there was some error. The error was \(error)")
        }
        audioPlayer.play()
}

у вас должен быть обратный вызов для первого воспроизведения звука. после завершения первого звука вы можете проверить свой if-else или попробовать переключатель.

также вы можете использовать задержку для воспроизведения второго звука

...