所以我一直在尝试将BGM添加到我的应用程序中,它可以工作,但每当我切换到另一个视图,然后切换回来,它将再次层BGM。我试过谷歌搜索,我看到其他人也有同样的问题,唯一的问题是我没有用目标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()
}
}发布于 2016-04-20 14:06:20
在viewWillAppear中,调用playBgMusic(),后者反过来调用audioPlayer.play()
因此,轨道正在重新开始,这是合理的,因为这是你要求它做的。我认为你需要的逻辑大致如下所示。
if !audioPlayer.playing {
playBgMusic()
} 或者如果你喜欢守卫的话
guard player.playing else {
playBgMusic()
}发布于 2016-04-20 14:11:54
每次加载视图时,您都要实例化一个新的AVAudioPlayer(),在前面的一个(S)上建立一个新的轨道。
只需使您的音频播放器类为单例。这也将允许您控制音乐从任何场景/屏幕在您的应用程序中的任何时间。
无论何时加载主屏幕,都要检查音乐是否已经在播放,如果没有,则调用playBgMusic(),否则什么也不做。
发布于 2016-04-20 14:13:09
您正在构建一个新的AVAudioPlayer,并在每次加载视图时将其分配给audioPlayer (即。当override func viewDidLoad()由iOS执行时)。因此,当您再次加载视图时,它是从零开始创建的,而旧视图可能仍然在工作。
https://stackoverflow.com/questions/36745723
复制相似问题