Подтвердить что ты не робот

IPhone: как сделать звук нажатия клавиш для пользовательской клавиатуры?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

    AudioServicesPlaySystemSound(0x450);

Ответ 3

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

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

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

- (BOOL) enableInputClicksWhenVisible {
    return YES;
}

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

[[UIDevice currentDevice] playInputClick];

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Все еще не соблюдает предпочтения включения/выключения tick.

Ответ 7

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

Найдите "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];
}

Что это!

Ответ 8

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

Для звука (творческого сообщества) просмотрите Freesound Project.

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

Ответ 9

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

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

Ответ 10

AudioServicesPlaySystemSound(soundID); 
AudioServicesDisposeSystemSoundID(soundID); 
then you won't hear a thing as you're discarding 
the system sound right after creating it.
You have to let it finish playing first.. 
Only call AudioServicesDisposeSystemSoundID to cancel the sound before it finishes

Но КАК бы вы: теперь играете звук... пусть он полностью закончит... затем правильно утилизируйте его?

(Разве вам не нравится просто, когда кто-то говорит: вы сделали все это неправильно... вы должны сделать это другим способом... но я не буду говорить вам, КАК это делать правильно.)

Ответ 11

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

И, конечно, окончательно удалите объект SystemSoundID в dealloc.