【发布时间】:2024-04-19 10:50:01
【问题描述】:
有没有办法以编程方式调用键盘“点击”声音?我的应用程序有一个自定义键盘(由 UIButtons 构建),我想在用户点击按键时提供一些音频反馈。我尝试在 Garageband 中创建自己的声音,但对我的任何创作都不满意。如果没有调用按键的标准方法,谁能给我指出一个可能有这样一个宝石的声音库?
【问题讨论】:
有没有办法以编程方式调用键盘“点击”声音?我的应用程序有一个自定义键盘(由 UIButtons 构建),我想在用户点击按键时提供一些音频反馈。我尝试在 Garageband 中创建自己的声音,但对我的任何创作都不满意。如果没有调用按键的标准方法,谁能给我指出一个可能有这样一个宝石的声音库?
【问题讨论】:
播放默认键盘声音有一个非常快速的解决方案:
添加 AudioToolbox.framework
在您希望播放声音的任何位置添加以下行:
AudioServicesPlaySystemSound(0x450);
【讨论】:
从 iOS 4.2 开始,在 UIView 的自定义子类上采用 UIInputViewAudioFeedback 协议。将此视图设为您的“inputView”,然后在适当的时候调用“playInputClick”。
只是为了节省一些人的时间。把它放在你的自定义视图中:
- (BOOL) enableInputClicksWhenVisible {
return YES;
}
要让点击这样做:
[[UIDevice currentDevice] playInputClick];
【讨论】:
无需将文件复制到您自己的应用程序中 - 您应该可以直接从 UIKit 框架中获取它:
CFURLRef soundFileURLRef = CFBundleCopyResourceURL(
CFBundleGetBundleWithIdentifier(CFSTR("com.apple.UIKit")),
CFSTR ("Tock"),CFSTR ("aiff"),NULL);
【讨论】:
这是我根据 aSquared 的评论做出的:
NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &soundID);
AudioServicesPlaySystemSound(soundID);
AudioServicesDisposeSystemSoundID(soundID);
【讨论】:
我找到的最简单的方法是从 iPhone 模拟器中提取 Tock.aiff(键盘声音)并将其与您的应用程序打包,然后在适当的时候使用 AudioServicesPlaySystemSound() 播放它。在我的机器上,只需在 Spotlight 中键入 Tock.aiff 即可打开该文件,但如果您必须去寻找它,它位于 UIKit.framework 的模拟器版本中。
【讨论】:
使用 0x450 作为 SystemSoundID 对我有用(并且音量正确 - 只是播放内置的 Tock.aiff 声音太大了)。不知道它的便携性——这是在第三代 iPod Touch 上。
仍然不尊重勾选/关闭的偏好。
【讨论】:
这就是我所做的:
在以下位置找到“Tock.aiff”:/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/System/Library/Frameworks/UIKit.framework
将它拖到 xCode 中的资源文件夹中,勾选“将项目复制到目标组的文件夹”
将 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];
}
就是这样!
【讨论】:
据我所知,点击声音不适用于应用程序。我在音频会话服务中没有看到任何相关的内容。 AudioServicesPlaySystemSound() 看起来很有希望,但似乎没有任何系统声音 ID 用于点击声音(仔细查看标题可能会出现一些东西)。您可以随时循环调用AudioServicesPlaySystemSound(i) 并查看是否有任何播放。 iPhone 软件恢复图像可能有声音,但它可能未获得一般使用许可。无需提及越狱 iPhone 以获得美妙的咔哒声。
对于(知识共享)声音,请查看Freesound Project。
对于未来,也许要求 Apple 公开除警报声音之外的系统声音,以便与 AudioServicesPlaySystemSound() 一起使用。
【讨论】:
可能有点晚了...
但是在 MrMage 上一篇文章中,如果你在 AudioServicesPlaySystemSound(soundID); 之后直接做 AudioServicesDisposeSystemSoundID(soundID);
那么您将听不到任何声音,因为您在创建系统声音后立即丢弃它。
你必须先让它完成播放。只有在它完成之前调用 AudioServicesDisposeSystemSoundID 来取消声音
【讨论】:
您不必立即处理声音对象。 将指向该声音对象的指针保存在属性中,并仅在您要播放另一个声音时才释放它,然后再重新创建它。
当然最后在 dealloc 中处理 SystemSoundID 对象。
【讨论】: