在 iOS 中按下特定按钮时播放特定声音

Posted

技术标签:

【中文标题】在 iOS 中按下特定按钮时播放特定声音【英文标题】:Play specific sound when specific button is pressed in iOS 【发布时间】:2017-05-14 03:21:12 【问题描述】:

我是 ios 开发的初学者,我正在尝试制作一个简单的应用程序,该应用程序在按下特定按钮时播放特定声音,并带有两个分段控制选项(如下图所示)。我在 YouTube、stack 和其他网站上查找了很多教程,但它们似乎都给了我很多错误,或者对我来说太难理解了(因为我太没有经验了)。

我的一些尝试,但这仅适用于 1 个按钮和 1 个声音。

import UIKit
import AVFoundation

class ViewController: UIViewController 
    // make sure to add this sound to your project
    var pianoSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("C", ofType: "m4a"))
    var audioPlayer = AVAudioPlayer()

    override func viewDidLoad() 
        super.viewDidLoad()
        audioPlayer = AVAudioPlayer(contentsOfURL: pianoSound, error: nil)
        audioPlayer.prepareToPlay()
    

    @IBAction func PianoC(sender: AnyObject) 
        audioPlayer.play()
    

请教我如何制作这个应用程序,如下图所示?

http://imgur.com/tWgCDWD

必选:三个按钮(猫、狗、鸟),每个按钮都有自己的声音。和第一个分段(声音)用于启用或禁用声音,例如。当用户选择关闭声音选项时,即使单击按钮也不会发出声音,第二个分段用于启用或禁用背景音乐。

【问题讨论】:

不清楚你想做什么。您的分段控件和 3 个按钮有 4 种可能的组合。在 4 种不同的可能状态下,每个按钮应该播放什么声音? 【参考方案1】:

因此,创建一个按名称播放声音的方法,并让每个按钮操作调用该方法。还让每个方法在开始播放该声音之前检查您的播放声音开关的状态。

@IBOutlet weak playSoundSwitch: UISwitch!

var backgroundMusicPlayer: AVAudioPlayer?

@discardableResult func playSound(named soundName: String) -> AVAudioPlayer 
    var soundURL = NSURL(fileURLWithPath: 
      NSBundle.mainBundle().pathForResource(soundName, ofType: "m4a"))
    audioPlayer = AVAudioPlayer(contentsOfURL: soundURL, error: nil)
    ( it MUST be a class variable )
    audioPlayer.play()
    return audioPlayer


@IBAction func catButtonPressed(sender: AnyObject) 
  if playSoundSwitch.isOn 
    playSound("catSound")
  


@IBAction func dogButtonPressed(sender: AnyObject) 
  if playSoundSwitch.isOn 
    playSound("dogSound")
  


@IBAction func birdButtonPressed(sender: AnyObject) 
  if playSoundSwitch.isOn 
    playSound("birdSound")
  


@IBAction func playBackgroundMusicSwitchChanged(sender: UISwitch) 
  if sender.isOn 
    backgroundMusicPlayer = playSound("backgroundSound")
   else 
    backgroundMusicPlayer?.stop()
    backgroundMusicPlayer = nil
  

以上假设您的背景音乐声音足够长,可以持续整个会话。如果您需要在每次结束时重复声音,那将更加复杂。您必须将自己设置为声音播放器的代表,并在每次结束时重新启动它。您将使用 audioPlayerDidFinishPlaying(_:successfully:) 委托方法。

如果您希望播放声音开关提前终止当前声音,您需要添加逻辑来处理它。同样,如果您想一次只允许一种动物的声音,则必须为 that 添加逻辑。

(上面的代码在 SO 编辑器中被打掉了。它可能包含需要清理的小语法错误。它仅作为指导,而不是复制/粘贴代码。)

最新语法..

import AVFoundation
class yourClass 
    var _sfx: AVAudioPlayer? // IT >MUST< BE a class variable
    func sound(named: String) 

        let u = Bundle.main.path(forResource: named, ofType: "m4a")!
        let s = URL(fileURLWithPath:u)
        do 
            _sfx = try AVAudioPlayer(contentsOf: s)
            _sfx.play()

            // note, you >CAN NOT< say here ..
            // let variable = try AVAudioPlayer(contentsOf: s)
            // IT >MUST< BE a class variable
        
        catch  print("WOE!"); return 
        print("PLAYED \(named)")
    

【讨论】:

谢谢!我对代码做了一点修改,现在可以正常工作了。 我弹出了最新的语法,帮派(随意编辑!)【参考方案2】:
import UIKit
import AVFoundation

class ViewController: UIViewController 

    @IBOutlet weak var playSoundSwitch: UISegmentedControl!

    var backgroundMusicPlayer: AVAudioPlayer?

    var player:AVAudioPlayer = AVAudioPlayer()

    @discardableResult func playSound(named soundName: String) -> AVAudioPlayer 


        let audioPath = Bundle.main.path(forResource: soundName, ofType: "wav")
        player = try! AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL)
        player.play()
        return player
    


    @IBAction func catButtonPressed(_ sender: Any) 

        if playSoundSwitch.selectedSegmentIndex == 0 
            playSound(named: "catSound")
        


    

    @IBAction func dogButtonPressed(_ sender: Any) 
        if playSoundSwitch.selectedSegmentIndex == 0 
            playSound(named: "dogSound")
        
    

    @IBAction func birdButtonPressed(_ sender: Any) 

        if playSoundSwitch.selectedSegmentIndex == 0 
            playSound(named: "birdSound")
            print("bird sound")
        
    

    @IBAction func playBackgroundMusicSwitchChanged(_ sender: Any) 


        if (sender as AnyObject).selectedSegmentIndex == 0 
            backgroundMusicPlayer = playSound(named: "backgroundSound")
         else 
            backgroundMusicPlayer?.stop()
            backgroundMusicPlayer = nil
        
    


【讨论】:

以上是关于在 iOS 中按下特定按钮时播放特定声音的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中按下按钮播放广播电台

在swift5中按下特定按钮时如何使用代码呈现tabBarViewController(在情节提要中创建)?

如何知道 youtube 视频何时开始播放以及何时在 ios 的 web 视图中按下 mpmovieplayer 的完成按钮

当我按下特定按钮时关闭上一个窗口[重复]

当我按下快速播放按钮时,声音播放失败

使用 Monotouch 播放默认 iOS 系统声音