UIButton - 如何让它播放声音

Posted

技术标签:

【中文标题】UIButton - 如何让它播放声音【英文标题】:UIButton - How to make it play a sound 【发布时间】:2012-05-18 02:05:26 【问题描述】:

我在 nib (xib) 中有一个 UIButton,它喜欢在触摸时播放声音,需要遵循什么协议才能做到这一点?

** 大修问题** 在我在 Stack Overflow 上的这段时间里,我学到了很多东西,不仅仅是关于我通常需要帮助的内容(Objective-C,xCode),还有 Stack Overflow 的工作原理.我发现它提供了大量的信息和支持,并且我已经研究过我之前是如何提出这个问题的,但它完全没有任何意义。为了帮助未来的用户,我以其他人可以理解的方式编辑了我最初要求的内容,就像下面的 Naveen 所做的那样。道歉

【问题讨论】:

我认为只下载互联网或其他网站的声音文件会非常容易。 好吧,回想起来我学到了很多,因为当我问这个问题对 ios 来说真的很新,但投票否决.. 真的吗?我相信有一天会有人偶然发现这个问题,Naveen 把我带到了那里,他的回答是正确的! 【参考方案1】:

添加这个框架

AudioToolBox framework

包含这个头文件.h文件

#include <AudioToolbox/AudioToolbox.h>
CFURLRef        soundFileURLRef;
SystemSoundID   soundFileObject;

在 viewdidLoad 中添加这段代码

NSURL *tapSound   = [[NSBundle mainBundle] URLForResource: @"Voice035"
                                            withExtension: @"amr"];

    // Store the URL as a CFURLRef instance
self.soundFileURLRef = (CFURLRef) [tapSound retain];

    // Create a system sound object representing the sound file.
AudioServicesCreateSystemSoundID (
                                  soundFileURLRef,
                                  &soundFileObject
                                  );

在按钮点击时,调用此方法

 AudioServicesPlayAlertSound (soundFileObject);

在 dealloc 中释放

AudioServicesDisposeSystemSoundID (soundFileObject);
CFRelease (soundFileURLRef);

欲了解更多信息:http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/SystemSoundServicesReference/Reference/reference.html#//apple_ref/c/func/AudioServicesCreateSystemSoundID

【讨论】:

Naveen,我很抱歉很久以前我没有接受这个答案,这就是我为我需要它而实施它的方式,我只是有一段时间没有这样做了,但坚信代表很重要。再次感谢【参考方案2】:

我想说,创建一个“观察者”类来播放所有按钮都连接到的声音。我将在下面举一个例子,它是一个单例类。它是一时兴起写的,没有经过测试,但会给你一个想法。

//SoundObserver.h

#include <AVFoundation/AVFoundation.h>

@interface SoundObserver 

    AVAudioPlayer *audioPlayer;

-(void)playSound;
+(SoundObserver*)sharedInstance;

@property (nonatomic, retain) AVAudioPlayer *audioPlayer;

@end


//SoundObserver.m

static SoundObserver *instance = nil;

@implementation SoundObserver


-(id)init 

    self = [super init];

    if(self) 

  //Get path to file.
  NSString *filePath = [[NSBundle mainBundle] pathForResource:@"sound"
                                                       ofType:@"wav"];

  // filePath to URL
  NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath];

  //Initialize the AVAudioPlayer.
  self.audioPlayer = [[AVAudioPlayer alloc]
                           initWithContentsOfURL:fileURL error:nil];

  // Preloads buffer and prepare for use.
  [self.audioPlayer prepareToPlay];

  [filePath release];
  [fileURL release];

    



+(SoundObserver*)sharedInstance 

        @synchronized(self) 

        if (instance == nil)

            instance = [[self alloc] init];
    

    return instance;



-(void)playSound 

    //make sure the audio resets to beginning each activation.

    [self.audioPlayer play];


-(void)dealloc 

    //Clean up
    [self.audioPlayer release];
    self.audioPlayer = nil;
    [super dealloc];




// User example.

In applicationDidFinishLaunching:

    [SoundObserver sharedInstance];

From here you can connect all buttons to the same function, or call it from anywhere in the App that #import's SoundObserver.h

-(IBOutlet)buttonClick:(id)sender 

    [[SoundObserver sharedInstance] playSound];

【讨论】:

谢谢马克,我刚刚看到我问这个问题有多糟糕,因为我使用了我的 iPhone 和 6 到 8 应用程序,呃,真是一团糟,但看起来你明白了我的意思,我要试试这个方法,你知道吗!

以上是关于UIButton - 如何让它播放声音的主要内容,如果未能解决你的问题,请参考以下文章

如何让MediaPlayer重复播放声音?

触发 AVAudioPlayer 以停止所有声音并播放选定的声音,除非单击播放(选定)按钮

不要播放声音[关闭]

如何在 Java 中以给定的采样率播放声音?

在 iOS 中以编程方式使按钮播放声音

如何使用键盘事件通过 URLrequest 播放声音?