ios - 在后台播放音乐并切换 View

标签 ios swift

所以我一直在尝试将 BGM 添加到我的应用程序中,它有效,但每当我切换到另一个 View 然后再切换回来时,它都会再次对 BGM 进行分层。 我尝试过谷歌搜索,发现其他人也有同样的问题, 我被困在这里的唯一一点是我不是用 Objective-C 编码,而是用 Swift 编码,除了一大堆 Taylor Swift 之外,我找不到解决方案 D:

以下是我用来编写BGM的代码。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var ButtonSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("tamborine", ofType: "wav")!)
    var audioPlayer = AVAudioPlayer()

   /* var Bgm = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Waiting-in-the-Woods", ofType: "mp3")!), error: nil) */

    func playBgMusic(){
        let musicPath = NSBundle.mainBundle().pathForResource("Waiting-in-the-Woods", ofType: "mp3")
        let url = NSURL(fileURLWithPath: musicPath!)
        audioPlayer = AVAudioPlayer(contentsOfURL: url, error: nil)
        audioPlayer.numberOfLoops = -1
        //-1為循環播放
        audioPlayer.volume = 1
        audioPlayer.prepareToPlay()
        audioPlayer.play()


    }


    override func viewDidLoad() {
        super.viewDidLoad()

        audioPlayer = AVAudioPlayer(contentsOfURL: ButtonSound, error: nil)

               //Bgm.play()
    }

    override func viewWillAppear(animated: Bool) {

        playBgMusic()
        if !audioPlayer.playing {
            audioPlayer.play()
        }
    }

最佳答案

在 viewWillAppear 中,您调用 playBgMusic(),后者又调用 audioPlayer.play()

因此,轨道重新开始这一事实是有道理的,因为这就是您要求它执行的操作。我认为您需要的逻辑类似于以下内容。

if !audioPlayer.playing {
  playBgMusic()
} 

或者如果你喜欢保护声明

guard player.playing else {
  playBgMusic()
}

关于ios - 在后台播放音乐并切换 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36745723/

相关文章:

iOS 内部分发由外部供应商开发的应用程序

ios - 在 Assets 中创建了一个组。之后图像无法加载(甚至应用程序图标)

iOS 12 Navigation Bar bar Button 在取消弹出手势时变灰

ios - 如何在 Objective-C 中使用 NSRange 获取上限和下限?

iphone - 在 iPhone 和 iPad 中实现 VOIP

arrays - Swift 中的最接近匹配字符串数组排序

ios - 在 SWIFT 中调用 SOAP 服务

带有附加数据的 Swift 3 错误

ios - 将alamofire响应解析为JSON返回nil

iphone - 正确使用 viewDidUnload