iPhone: как сделать звук нажатия клавиш для пользовательской клавиатуры? - PullRequest
19 голосов
/ 04 мая 2009

Есть ли способ программно вызывать звук "щелчка" клавиатуры? Мое приложение имеет пользовательскую клавиатуру (построенную из кнопок UIB), и я хотел бы предоставить звуковую обратную связь, когда пользователь нажимает на клавиши. Я пытался создавать свои собственные звуки в Garageband, но не был доволен ни одним из моих творений. Если не существует стандартного способа вызвать нажатие клавиши, может кто-нибудь указать мне библиотеку звуков, которая может иметь такой драгоценный камень?

Ответы [ 10 ]

31 голосов
/ 03 февраля 2011

Существует очень быстрое решение для воспроизведения звука клавиатуры по умолчанию:

  1. Добавить AudioToolbox.framework
  2. Добавьте следующую строку, где вы хотите, чтобы звучал звук:

    AudioServicesPlaySystemSound(0x450);

23 голосов
/ 25 января 2011

Начиная с iOS 4.2, применяйте протокол UIInputViewAudioFeedback в пользовательском подклассе UIView. Сделайте этот просмотр вашим «inputView», а затем вызовите «playInputClick» в соответствующее время.

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

Просто чтобы сэкономить время людям. Поместите это в ваш собственный вид:

- (BOOL) enableInputClicksWhenVisible {
    return YES;
}

Чтобы сделать клик, сделайте следующее:

[[UIDevice currentDevice] playInputClick];
13 голосов
/ 01 августа 2009

Нет необходимости копировать файл в ваше собственное приложение - вы сможете получить его непосредственно из инфраструктуры UIKit:

CFURLRef soundFileURLRef = CFBundleCopyResourceURL(
    CFBundleGetBundleWithIdentifier(CFSTR("com.apple.UIKit")),
    CFSTR ("Tock"),CFSTR ("aiff"),NULL);
9 голосов
/ 20 сентября 2009

Вот что я сделал из этого комментария aSquared:

NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &soundID);
AudioServicesPlaySystemSound(soundID);
AudioServicesDisposeSystemSoundID(soundID);
8 голосов
/ 08 октября 2009

Использование 0x450 в качестве SystemSoundID работает для меня (и на правильной громкости - просто играть на встроенном Tock.aiff было слишком громко). Не знаю, насколько это портативно - это на iPod Touch 3-го поколения.

По-прежнему не учитывает предпочтения включения / выключения галочки.

8 голосов
/ 04 мая 2009

Самый простой способ, который я нашел, - это извлечь Tock.aiff (звук клавиатуры) из симулятора iPhone и упаковать его в свое приложение, а затем воспроизвести его, используя AudioServicesPlaySystemSound() в соответствующее время. На моей машине простой ввод Tock.aiff в Spotlight приводит к включению файла, но если вам нужно его искать, он находится в симуляционной версии UIKit.framework.

4 голосов
/ 23 мая 2011

Вот что я сделал:

Найдите «Tock.aiff» в: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/System/Library/Frameworks/UIKit.framework

Перетащите его в папку «Ресурсы» в xCode, отметив «Копировать объекты в папку целевой группы»

Импорт AVFoundation.framework в папку Frameworks в xCode

Импорт 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];
}

Вот и все!

2 голосов
/ 04 мая 2009

Насколько я могу судить, звук щелчка недоступен для приложений. Я не видел ничего в аудиосессионных сервисах, которое было бы актуально. AudioServicesPlaySystemSound() выглядит многообещающе, но для звука щелчка, похоже, нет идентификатора системного звука (при более внимательном рассмотрении заголовков что-то может оказаться) Вы всегда можете зациклить вызов на AudioServicesPlaySystemSound(i) и посмотреть, играет ли что-нибудь. Изображения восстановления программного обеспечения iPhone, вероятно, имеют звук, но, вероятно, не лицензированы для общего использования. Не нужно упоминать джейлбрейк iPhone, чтобы получить приятный звук щелчка.

Для звуков (Creative Commons), ознакомьтесь с Freesound Project .

В будущем, возможно, попросите Apple предоставить системные звуки, отличные от звука оповещения, для использования с AudioServicesPlaySystemSound().

1 голос
/ 17 сентября 2010

Вам не нужно сразу избавляться от звукового объекта. Держите указатель на этот звуковой объект в свойстве и утилизируйте его только тогда, когда вы собираетесь воспроизвести другой звук, прежде чем создавать его заново.

И, наконец, наконец, избавьтесь от объекта SystemSoundID в dealloc.

1 голос
/ 22 марта 2010

Может быть немного поздно ... Но в последнем посте MrMage, если вы делаете AudioServicesDisposeSystemSoundID(soundID); сразу после AudioServicesPlaySystemSound(soundID); тогда вы не услышите ничего, поскольку отбрасываете системный звук сразу после его создания.

Вы должны дать ему сначала закончить воспроизведение .. Только вызовите AudioServicesDisposeSystemSoundID, чтобы отменить звук до его завершения

...