我的 AVAudioPlayer
有一个奇怪的小问题,我找不到一个很好的整洁的解决方案。我使用以下函数在我的应用程序的菜单屏幕中播放一些背景音乐:
func startMusic() {
do {
try musicPlayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("menu_music", ofType: "mp3")!))
} catch let err as NSError {
print (err.debugDescription)
}
musicPlayer.prepareToPlay()
musicPlayer.numberOfLoops = -1
musicPlayer.play()
}
我在viewDidLoad
中这样调用它:
override func viewDidLoad() {
super.viewDidLoad()
startMusic()
}
到目前为止一切顺利。
菜单有几个按钮,这些按钮可以通过转场将用户带到其他屏幕,这些转场都是在界面生成器中创建的 - 没有编程转场。
第一个问题是当其他屏幕加载时音乐继续播放。在大多数情况下,这实际上是一个很好的、理想的效果,但我想知道除了创建包含 musicPlayer.stop()
或 的菜单按钮操作之外,是否有其他方法可以阻止它>musicPlayer.pause()
。例如,一个 View Controller 可以停止在另一个 View Controller 中启动的 AVAudioPlayer
吗?
我遇到的更严重的问题是,当我导航回菜单屏幕时(再次通过启动界面生成器创建的segue的按钮),音乐的重复副本开始在原始音乐上播放(声音太可怕了)并且似乎没有任何方法可以阻止它或检查它是否正在播放。如果单击更多菜单选项然后返回,则会开始播放更多音乐副本。
我已经尝试过
if (!musicPlayer.playing) {
musicPlayer.play()
}
和
if (musicPlayer == nil) {
musicPlayer.play()
}
以及每次停止和启动播放器,但我仍然会得到相同音乐的多个副本相互播放。这就好像有多个同名的音乐播放器无法停止,或者同一 View Controller 的多个副本在后台运行。
我意识到我可能在这里遗漏了一些绝对基本的东西,但谷歌搜索未能为我提供答案,我知道 Stack Overflow 的优秀人员不会让我失望。
谢谢。
最佳答案
在主视图 Controller 的 viewWillDisappear
中,您可以停止
您的AVAudioPlayer
。
例如:
override func viewWillDisappear(animated: Bool) {
musicPlayer.stop()
}
关于ios - AVAudioPlayer 在转场后继续播放并在返回原始 View Controller 时重新启动 - 我怎样才能停止它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37511952/