web-dev-qa-db-ja.com

iPhone:カスタムキーパッドのキークリック音を出す方法は?

キーパッドの「クリック」音をプログラムで呼び出す方法はありますか?私のアプリにはカスタムキーパッド(UIButtonから構築)があり、ユーザーがキーをタップしたときに音声フィードバックを提供したいと思います。 Garagebandで自分のサウンドを作成しようとしましたが、どの作成にも満足できませんでした。キークリックを呼び出す標準的な方法がない場合、そのような宝石を持っている可能性のあるサウンドのライブラリを誰かに教えてもらえますか?

19
George Armhold

私が見つけた最も簡単な方法は、iPhoneシミュレーターからTock.aiff(キーボードサウンド)を抽出してアプリにパッケージ化し、適切なタイミングでAudioServicesPlaySystemSound()を使用して再生することです。私のマシンでは、SpotlightにTock.aiffと入力するだけでファイルが表示されますが、探しに行く必要がある場合は、UIKit.frameworkのシミュレーターバージョンにあります。

8

デフォルトのキーボードサウンドを再生するための非常に高速なソリューションがあります。

  1. AudioToolbox.frameworkを追加します
  2. サウンドを再生する場所に次の行を追加します。

    AudioServicesPlaySystemSound(0x450);

31
pposthoorn

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];
23
Ryan

ファイルを独自のアプリにコピーする必要はありません。UIKitフレームワークから直接取得できるはずです。

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

これは私がそれから作ったものですaSquaredのコメント:

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

SystemSoundIDとして0x450を使用すると、うまくいきます(そして、正しい音量で-組み込みのTock.aiffを再生するだけでは大きすぎました)。それがどれほどポータブルかはわかりません-これはiPodTouchの第3世代にあります。

それでも、ティックのオン/オフの設定は尊重されません。

8
Sam McCall

これが私がしたことです:

/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/System/Library/Frameworks/UIKit.frameworkで「Tock.aiff」を見つけます。

それを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];
}

それでおしまい!

4
bbeckford

私の知る限り、クリック音はアプリでは利用できません。オーディオセッションサービスで関連するものは何も見ていません。 AudioServicesPlaySystemSound()は有望に見えますが、クリック音のシステムサウンドIDがないようです(ヘッダーをよく見ると何かがわかる場合があります)。いつでもAudioServicesPlaySystemSound(i)の呼び出しをループして、何かが再生されるかどうかを確認できます。 iPhoneソフトウェアの復元イメージにはおそらくサウンドがありますが、一般的な使用はライセンスされていない可能性があります。おいしいクリック音を得るためにiPhoneを脱獄することについて言及する必要はありません。

(クリエイティブ・コモンズ)サウンドについては、 Freesound Project をチェックしてください。

将来的には、Apple AudioServicesPlaySystemSound()で使用するアラートサウンド以外のシステムサウンドを公開するように要求することもできます。

2
outis

少し遅れるかもしれません...しかし、MrMageの前回の投稿では、AudioServicesDisposeSystemSoundID(soundID);の直後にAudioServicesPlaySystemSound(soundID);を実行すると、直後にシステムサウンドを破棄しているため、何も聞こえません。それを作成します。

最初に再生を終了させる必要があります。終了する前にサウンドをキャンセルするには、AudioServicesDisposeSystemSoundIDを呼び出すだけです。

1
jyavenard

サウンドオブジェクトをすぐに破棄する必要はありません。そのサウンドオブジェクトへのポインタをプロパティに保持し、別のサウンドを再生しようとしているときにのみ破棄してから、再作成します。

そしてもちろん、最終的にSystemSoundIDオブジェクトをdeallocに破棄します。

1
jyavenard