【问题标题】:Toggle sound off straight away立即关闭声音
【发布时间】:2020-06-07 17:59:39
【问题描述】:

我创建了一个切换按钮来关闭/打开音乐。这个问题是我必须关闭应用程序才能生效。

这是我用来开始音乐的:

.onAppear(perform: {self.musicM.playSoundBand(sound: "Band", type: "wav")})

这是我的切换按钮:

 Toggle(isOn: self.$musicM.mOn) {
                    ZStack {
                        Image("Button")
                            .renderingMode(.original)
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .rotationEffect(Angle(degrees: 180))
                            .padding([.leading, .trailing], 40);
                        Text("Music")
                            .padding(.all, 20)
                            .padding([.leading, .trailing], 40)
                            .font(.largeTitle)
                            .foregroundColor(.black)
                    }
                    Spacer()
                }.onTapGesture(perform: {if self.musicM.mOn == false { self.musicM.pauseMusicBand(); self.soundEffectsM.playSound(sound: "GunCock", type: "wav")}})

我已经尝试过变体并使用 .stop() 但仍然无法正常工作。如果这有帮助的话,我的 soundmanager 类也是:

class musicModel: ObservableObject {
    var audioPlayerBand:AVAudioPlayer?
    @Published var mOn: Bool = UserDefaults.standard.bool(forKey: "mOn") {
        didSet {
            UserDefaults.standard.set(self.mOn, forKey: "mOn")
        }
    }
    func pauseMusicBand() {
        UserDefaults.standard.set(false, forKey: "mOn"); audioPlayerBand?.pause()
    }
    func setVolume(volume: Float) {
        audioPlayerBand?.volume = volume
    }
    func playSoundBand(sound: String, type: String) {
        if let path = Bundle.main.path(forResource: sound, ofType: type) {
            do {
                audioPlayerBand = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
                audioPlayerBand?.numberOfLoops =  -1
                audioPlayerBand?.play()
            } catch {
                print("ERROR: Could not find sound file!")
            }; if self.mOn == false { pauseMusicBand() }
        }
    }
}

【问题讨论】:

  • 看不懂是什么问题; “这个问题是我必须关闭应用程序才能生效。”和“我已经尝试过变体并使用 .stop() 但仍然无法正常工作。”请以不同的方式解释问题。
  • 好的,我会尽量讲清楚。在我的应用程序中,我播放了背景音乐。我创建了一个切换按钮,允许用户根据需要将音乐静音。问题是它不会立即静音,音乐会继续播放,直到我关闭应用程序,当我再次打开它时,音乐将被静音。我希望我能以更好的方式解释它。

标签: swift swiftui avaudioplayer audio-player togglebutton


【解决方案1】:

此测试代码展示了如何立即关闭声音:

import SwiftUI
import Foundation
import AVFoundation

struct ContentView: View {

@ObservedObject var musicM = musicModel()

var body: some View {
        Toggle(isOn: Binding<Bool>(
            get: { self.musicM.mOn },
            set: { self.musicM.mOn = $0; self.doMusic() })) {
            ZStack {
                Image("Button")
                    .renderingMode(.original)
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .rotationEffect(Angle(degrees: 180))
                    .padding([.leading, .trailing], 40);
                Text("Music")
                    .padding(.all, 20)
                    .padding([.leading, .trailing], 40)
                    .font(.largeTitle)
                    .foregroundColor(.black)
            }
            Spacer()
    }.onAppear(perform: self.startBackgroundMusic)
}

func startBackgroundMusic() {
    // if you want to always start the background music, then toggle should be set
//        self.musicM.mOn = true
//        self.musicM.playSoundBand(sound: "Band", type: "wav")

    // if you want to play the background music only if the user has set it last time
    if self.musicM.mOn {
        self.musicM.playSoundBand(sound: "Band", type: "wav")
    }
}

func doMusic() {
    if self.musicM.mOn {
        self.musicM.playSoundBand(sound: "Band", type: "wav")
    } else {
        self.musicM.audioPlayerBand?.pause()
     //   self.soundEffectsM.playSound(sound: "GunCock", type: "wav")
    }
}
}

class musicModel: ObservableObject {
var audioPlayerBand: AVAudioPlayer?

@Published var mOn: Bool = UserDefaults.standard.bool(forKey: "mOn") {
    didSet {
        UserDefaults.standard.set(self.mOn, forKey: "mOn")
    }
}
func pauseMusicBand() {
    UserDefaults.standard.set(false, forKey: "mOn")
    audioPlayerBand?.pause()
}
func setVolume(volume: Float) {
    audioPlayerBand?.volume = volume
}
func playSoundBand(sound: String, type: String) {
    if let path = Bundle.main.path(forResource: sound, ofType: type) {
        do {
            audioPlayerBand = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
            audioPlayerBand?.numberOfLoops =  -1
            audioPlayerBand?.play()
        } catch {
            print("ERROR: Could not find sound file!")
        }
    }
}
}

【讨论】:

  • 非常感谢,但是没有用。音乐仍会继续播放,直到应用程序关闭然后再次打开。可能是我,因为我不确定在哪里调用“doMusic”函数。我试图调用它而不是“self.startBackgroundMusic”,但没有任何变化。
  • 显示的代码没有任何问题。您可以发布您使用的代码吗?
  • 不,只是我是个白痴并且错误地调用了函数。你的代码像梦一样工作,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
相关资源
最近更新 更多