swift - 背景音乐和segues

时间:2015-08-24 18:20:44

标签: ios swift avfoundation playback

我目前正在玩一款游戏,游戏包含三个视图控制器:GameIntroViewController GameViewController GameOverViewController

每个视图控制器都通过推送segue链接。使用以下方法...

GameIntroViewController按钮 - >以编程方式GameViewController - > GameOverViewController按钮 - > GameViewController等等......

我目前正在设置应用程序以开始在我的GameIntroViewController中播放背景音乐,但这很有效,但音乐令人惊讶地重新启动每个segue,而这不是问题我&我#39; d喜欢音乐不重启但继续好像它是一段不受segues干扰的音轨。

最终,当显示GameOverViewController音乐时,我需要音乐暂停或停止,因为音乐会与播放的视频广告发生冲突。有人知道这样做的最好方法吗?

考虑一下,在GameIntroViewControllerGameViewController上播放不同的音乐,然后GameOverViewController上没有音乐会很棒。有没有想法如何在没有音乐播放的情况下实现这一目标?

到目前为止,这是我的代码.....(全部在GameIntroViewController

import AVFoundation

class GameIntroViewController: UIViewController {

var backgroundMusicPlayer:AVAudioPlayer = AVAudioPlayer()

override func viewDidLoad() {
    super.viewDidLoad()


}


override func viewWillLayoutSubviews() {
    var bgMusicURL:NSURL = NSBundle.mainBundle().URLForResource("bgMusic", withExtension: "m4a")!
    backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: bgMusicURL, error: nil)
    backgroundMusicPlayer.numberOfLoops = -1
    backgroundMusicPlayer.prepareToPlay()
    backgroundMusicPlayer.play()
}

感谢任何可以提供帮助的人......

2 个答案:

答案 0 :(得分:3)

每次初始化新控制器时,您当前正在创建一个新的AVAudioPlayer对象:

class GameIntroViewController: UIViewController {
    var backgroundMusicPlayer:AVAudioPlayer = AVAudioPlayer()
}

您应该将AVAudioPlayer对象设为全局,并将其设置一次。像这样:

var backgroundMusicPlayer:AVAudioPlayer = AVAudioPlayer()

class GameIntroViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        var bgMusicURL:NSURL = NSBundle.mainBundle().URLForResource("bgMusic", withExtension: "m4a")!
        backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: bgMusicURL, error: nil)
        backgroundMusicPlayer.numberOfLoops = -1
        backgroundMusicPlayer.prepareToPlay()
        backgroundMusicPlayer.play()
    }
}

同样非常重要的是要注意:仅在GameIntroViewController的viewDidLoad 中设置backgroundMusicPlayer ONCE。否则,只要此控制器显示其视图,它就会重新初始化。如果在其他控制器中设置此对象,它也将重置该对象。

这种方法还允许您从应用程序的任何位置播放和暂停backgroundMusicPlayer。

祝你好运,

ZR

答案 1 :(得分:0)

  

我希望音乐不会重新启动,但继续好像它是一段不受segues干扰的音轨

由于您希望音乐在视频控制器出现时继续播放,因此从视图控制器管理音乐是错误的方法。相反,创建一些其他控制器类型的对象来管理音乐(包括音频播放器,要播放的曲目列表等)。在应用程序的早期创建“音乐控制器”,并将其从一个视图控制器传递到下一个视图控制器,就像模型对象一样。也许更好的是,您可以将轨道列表作为应用程序数据模型的一部分,以便视图控制器可以简单地通过与模型交互来影响即将到来的音乐轨道 - 他们甚至不需要知道音乐控制器。