iPhone:カスタムキーパッドのキークリック音を作成する方法
質問
プログラムでキーパッドを「クリック」する方法はありますか?音?私のアプリには(UIButtonから構築された)カスタムキーパッドがあり、ユーザーがキーをタップしたときに音声フィードバックを提供したいと思います。 Garagebandで独自のサウンドを作成しようとしましたが、どの作品にも満足できませんでした。キークリックを呼び出す標準的な方法がない場合、誰かがそのような宝石を持つ可能性のあるサウンドのライブラリを指すことができますか?
解決
私が見つけた最も簡単な方法は、iPhoneシミュレーターからTock.aiff(キーボードサウンド)を抽出し、アプリにパッケージし、適切なタイミングで AudioServicesPlaySystemSound()
を使用して再生することです。 。私のマシンでは、SpotlightにTock.aiffと入力するだけでファイルが表示されますが、探しに行かなければならない場合は、UIKit.frameworkのシミュレーターバージョンにあります。
他のヒント
デフォルトのキーボードサウンドを再生するための非常に高速なソリューションがあります:
- 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);
SystemSoundIDとして0x450を使用することは私にとっては有効です(そして正しい音量で-組み込みのTock.aiffを再生するだけでは大きすぎました)。これがどれほど移植性があるかはわかりません。これはiPod Touchの第3世代のものです。
依然として、ティックのオン/オフの設定は尊重されません。
これが私がしたことです:
「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];
}
それだけです!
私が知る限り、クリック音はアプリで利用できません。関連する音声セッションサービスには何も見ていません。 AudioServicesPlaySystemSound()
は有望に見えますが、クリックサウンドのシステムサウンドIDが存在しないようです(ヘッダーをよく見ると何かがわかる場合があります)。 AudioServicesPlaySystemSound(i)
の呼び出しを常にループして、何かが再生されるかどうかを確認できます。 iPhoneソフトウェアの復元イメージにはおそらく音がありますが、おそらく一般的な使用にはライセンスされていません。おいしいクリック音を得るためにiPhoneを脱獄することについて言及する必要はありません。
(クリエイティブコモンズ)サウンドについては、 Freesoundプロジェクトをご覧ください。
将来的には、Appleが AudioServicesPlaySystemSound()
で使用するアラートサウンド以外のシステムサウンドを公開することを要求する可能性があります。
少し遅れて...
しかし、MrMageの最後の投稿では、 AudioServicesPlaySystemSound(soundID);
の直後に AudioServicesDisposeSystemSoundID(soundID);
を実行すると、
システムサウンドを作成した直後に破棄するので、音は聞こえません。
最初に再生を終了する必要があります。終了する前にAudioServicesDisposeSystemSoundIDを呼び出してサウンドをキャンセルするだけです
サウンドオブジェクトをすぐに破棄する必要はありません。 そのサウンドオブジェクトへのポインターをプロパティに保持し、再作成する前に別のサウンドを再生しようとしているときにのみ破棄します。
そしてもちろん、最終的にdeallocのSystemSoundIDオブジェクトを破棄します。