iPhone:如何为自定义键盘制作关键点击声?

时间:2009-05-04 01:38:05

标签: iphone audio click

有没有办法以编程方式调用键盘“点击”声音?我的应用程序有一个自定义键盘(由UIButtons构建),我想在用户点击键时提供一些音频反馈。我尝试在Garageband中创建自己的声音,但对我的任何创作都不满意。如果没有一种标准的方式来调用按键点击,有人能指出我可能有这样一个宝石的声音库吗?

10 个答案:

答案 0 :(得分:31)

播放默认键盘声音有一个非常快速的解决方案:

  1. 添加AudioToolbox.framework
  2. 在您希望播放声音的位置添加以下行:

    AudioServicesPlaySystemSound(0x450);

答案 1 :(得分:23)

从iOS 4.2开始,在UIView的自定义子类上采用UIInputViewAudioFeedback协议。将此视图设为“inputView”,然后在适当的时间调用“playInputClick”。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIInputViewAudioFeedback_ProtocolReference/Reference/Reference.html

只是为了节省一些人的时间。将其放在自定义视图中:

- (BOOL) enableInputClicksWhenVisible {
    return YES;
}

要点击,请执行以下操作:

[[UIDevice currentDevice] playInputClick];

答案 2 :(得分:13)

无需将文件复制到您自己的应用程序中 - 您应该可以直接从UIKit框架获取它:

CFURLRef soundFileURLRef = CFBundleCopyResourceURL(
    CFBundleGetBundleWithIdentifier(CFSTR("com.apple.UIKit")),
    CFSTR ("Tock"),CFSTR ("aiff"),NULL);

答案 3 :(得分:9)

这是我用aSquared的评论做出的:

NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &soundID);
AudioServicesPlaySystemSound(soundID);
AudioServicesDisposeSystemSoundID(soundID);

答案 4 :(得分:8)

我发现最简单的方法是从iPhone模拟器中提取Tock.aiff(键盘声音)并将其与您的应用程序打包,然后在适当的时候使用AudioServicesPlaySystemSound()播放它。在我的机器上,只需在Spotlight中键入Tock.aiff即可调出文件,但如果你必须去寻找它,那就是UIKit.framework的模拟器版本。

答案 5 :(得分:8)

使用0x450作为SystemSoundID适用于我(并且在正确的音量 - 只是播放内置的Tock.aiff太大声)。不知道它是多么便携 - 这是在iPod Touch第三代。

仍然不尊重打开/关闭打勾的偏好。

答案 6 :(得分:4)

这就是我的所作所为:

在以下位置找到'Tock.aiff':/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/System/Library/Frameworks/UIKit.framework

将其拖到xCode中的Resources文件夹中,勾选'将项目复制到目标组的文件夹'

将AVFoundation.framework导入xCode

中的Frameworks文件夹

在班级顶部导入AVFoundation:

#import <AVFoundation/AVAudioPlayer.h>

使用以下功能:

- (void)PlayClick {
    NSURL* musicFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                               pathForResource:@"Tock"
                                               ofType:@"aiff"]];
    AVAudioPlayer *click = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:nil];
    [click setVolume:0.15f];
    [click play];
}

就是这样!

答案 7 :(得分:2)

据我所知,点击声音不适用于应用。我还没有看到任何相关的音频会话服务。 AudioServicesPlaySystemSound()看起来很有希望,但咔哒声似乎没有任何系统声音ID(仔细查看标题可能会出现问题)。您可以随时循环调用AudioServicesPlaySystemSound(i)并查看是否有任何播放。 iPhone软件恢复图像可能有声音,但它可能没有获得通用许可。不需要提及越狱iPhone以获得美味的咔嗒声。

对于(创意公共)声音,请查看Freesound Project

对于将来,可能要求Apple公开系统声音而不是警告声音以用于AudioServicesPlaySystemSound()

答案 8 :(得分:1)

也许有点晚了...... 但是在MrMage上一篇文章中,如果你在AudioServicesDisposeSystemSoundID(soundID);之后AudioServicesPlaySystemSound(soundID);直接{{1}} 那么你就不会听到任何东西,因为你在创建它之后就会丢弃系统声音。

你必须先让它完成播放..只有在完成之前调用AudioServicesDisposeSystemSoundID取消声音

答案 9 :(得分:1)

您不必立即处理声音对象。 在属性中保留指向该声音对象的指针,并且只有在您要重新创建它之前播放另一个声音时才将其丢弃。

当然最后在dealloc中处理SystemSoundID对象。