iPhone: como fazer som das teclas clique para teclado personalizado?
Pergunta
Existe uma maneira para programaticamente invocar o teclado "clique" som? Meu aplicativo tem um teclado personalizado (construída a partir de UIButtons) e eu gostaria de fornecer algum feedback de áudio quando o usuário toca nas teclas. Eu tentei criar meus próprios sons no Garageband, mas não estava feliz com qualquer uma das minhas criações. Se não houver uma maneira padrão para invocar o clique chave, alguém pode me aponte para uma biblioteca de sons que pode ter como uma jóia?
Solução
A maneira mais simples que eu encontrei é para extrair Tock.aiff (o som do teclado) do iPhone Simulator e empacotá-lo com o seu aplicativo, em seguida, jogá-lo usando AudioServicesPlaySystemSound()
no momento apropriado. Na minha máquina, simplesmente digitando Tock.aiff em Spotlight vira para cima o arquivo, mas se você tem que ir olhando para ele, é na versão do simulador de UIKit.framework.
Outras dicas
Há uma solução muito rápida para reproduzir o som do teclado padrão:
- Adicionar AudioToolbox.framework
-
Adicione a seguinte linha onde quer que você deseja que o som para jogar:
AudioServicesPlaySystemSound(0x450);
A partir do iOS 4.2, adotar o protocolo UIInputViewAudioFeedback em uma subclasse personalizada de UIView. Faça este ponto de vista o seu "inputView" e, em seguida, chamar de "playInputClick" no momento apropriado.
Apenas para poupar algum tempo as pessoas. Colocar isso em sua exibição personalizada:
- (BOOL) enableInputClicksWhenVisible {
return YES;
}
Para fazer o clique fazer isso:
[[UIDevice currentDevice] playInputClick];
Não há necessidade de copiar o arquivo para o seu próprio app - você deve ser capaz de obtê-lo diretamente a partir do framework UIKit:
CFURLRef soundFileURLRef = CFBundleCopyResourceURL(
CFBundleGetBundleWithIdentifier(CFSTR("com.apple.UIKit")),
CFSTR ("Tock"),CFSTR ("aiff"),NULL);
Isto é o que eu fiz fora dele o comentário de asquared:
NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &soundID);
AudioServicesPlaySystemSound(soundID);
AudioServicesDisposeSystemSoundID(soundID);
Usando 0x450 como o SystemSoundID funciona para mim (e no volume correto - apenas jogar o built-in Tock.aiff era muito alto). Não faço ideia como portátil que é -. Isso é em um iPod Touch 3ª gen
Ainda não respeitar a preferência por carrapato on / off.
Aqui está o que eu fiz:
Localize 'Tock.aiff' em: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/System/Library/Frameworks/UIKit.framework
arrastá-lo para seus recursos de pasta no Xcode, assinalando 'Copiar itens no grupo de destino é a pasta'
Import AVFoundation.framework nos quadros pasta na xCode
Import AVFoundation no topo da sua classe:
#import <AVFoundation/AVAudioPlayer.h>
Use a seguinte função:
- (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];
}
É isso aí!
Do que eu posso dizer, o som do clique não está disponível para aplicativos. Eu não vi nada em serviços de sessão de áudio que é relevante. olhares AudioServicesPlaySystemSound()
promissor, mas há não parece ser qualquer ID som sistema de som de clique (um olhar mais atento os cabeçalhos podem transformar-se algo). Você pode sempre laço sobre uma chamada para AudioServicesPlaySystemSound(i)
e ver se joga nada. O software iPhone restaurar imagens provavelmente tem o som, mas provavelmente não está licenciado para uso geral. Jailbreaking um iPhone para chegar ao som de clique saborosa não precisa ser mencionado.
Para (creative commons) sons, consulte a Freesound Projeto .
Para o futuro, talvez solicitar que a Apple expor outros que o som de alerta para uso com AudioServicesPlaySystemSound()
sons do sistema.
Talvez um pouco tarde ...
Mas, em MrMage último post, se você fizer AudioServicesDisposeSystemSoundID(soundID);
logo após AudioServicesPlaySystemSound(soundID);
então você não vai ouvir uma coisa que você está descartando o direito de som do sistema depois de criá-lo.
Você tem que deixá-lo terminar de jogar primeiro .. Só chamada AudioServicesDisposeSystemSoundID para cancelar o som antes de terminar
Você não tem que descartar o objeto de som imediatamente. Manter um ponteiro para esse objeto de som em uma propriedade, e descartá-la somente quando você está prestes a jogar um outro som antes de re criando-lo.
E, claro, finalmente, dispor do objeto SystemSoundID em dealloc.