首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在背景中播放音乐和转换观点

问在背景中播放音乐和转换观点
EN

Stack Overflow用户
提问于 2016-04-20 13:41:48
回答 3查看 54关注 0票数 0

所以我一直在尝试将BGM添加到我的应用程序中,它可以工作,但每当我切换到另一个视图,然后切换回来,它将再次层BGM。我试过谷歌搜索,我看到其他人也有同样的问题,唯一的问题是我没有用目标C编码,我用Swift编码,除了很多Taylor Swift之外,我找不到解决方案D:

下面是我用来写BGM的代码。

代码语言:javascript
复制
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()
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-20 14:06:20

在viewWillAppear中,调用playBgMusic(),后者反过来调用audioPlayer.play()

因此,轨道正在重新开始,这是合理的,因为这是你要求它做的。我认为你需要的逻辑大致如下所示。

代码语言:javascript
复制
if !audioPlayer.playing {
  playBgMusic()
} 

或者如果你喜欢守卫的话

代码语言:javascript
复制
guard player.playing else {
  playBgMusic()
}
票数 0
EN

Stack Overflow用户

发布于 2016-04-20 14:11:54

每次加载视图时,您都要实例化一个新的AVAudioPlayer(),在前面的一个(S)上建立一个新的轨道。

只需使您的音频播放器类为单例。这也将允许您控制音乐从任何场景/屏幕在您的应用程序中的任何时间。

无论何时加载主屏幕,都要检查音乐是否已经在播放,如果没有,则调用playBgMusic(),否则什么也不做。

票数 0
EN

Stack Overflow用户

发布于 2016-04-20 14:13:09

您正在构建一个新的AVAudioPlayer,并在每次加载视图时将其分配给audioPlayer (即。当override func viewDidLoad()由iOS执行时)。因此,当您再次加载视图时,它是从零开始创建的,而旧视图可能仍然在工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36745723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档