OKAY, finalmente lo tengo! El truco es observar las notificaciones de cambio de UITextInputMode y luego reunir el identificador del modo cambiado (el código parece evitar el uso directo de la API privada, aunque parece requerir un poco de conocimiento de la API privada en general), y cuando el modo cambia a dictado, resignFirstResponder (que cancelará el dictado de voz). ¡HURRA! Aquí hay un código:
En algún lugar de delegado de la aplicación (al menos eso es donde lo puse)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputModeDidChange:) name:@"UITextInputCurrentInputModeDidChangeNotification"
object:nil];
Y entonces usted puede
UIView *resignFirstResponder(UIView *theView)
{
if([theView isFirstResponder])
{
[theView resignFirstResponder];
return theView;
}
for(UIView *subview in theView.subviews)
{
UIView *result = resignFirstResponder(subview);
if(result) return result;
}
return nil;
}
- (void)inputModeDidChange:(NSNotification *)notification
{
// Allows us to block dictation
UITextInputMode *inputMode = [UITextInputMode currentInputMode];
NSString *modeIdentifier = [inputMode respondsToSelector:@selector(identifier)] ? (NSString *)[inputMode performSelector:@selector(identifier)] : nil;
if([modeIdentifier isEqualToString:@"dictation"])
{
[UIView setAnimationsEnabled:NO];
UIView *resigned = resignFirstResponder(window);
[resigned becomeFirstResponder];
[UIView setAnimationsEnabled:YES];
UIAlertView *denyAlert = [[[UIAlertView alloc] initWithTitle:@"Denied" message:nil delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil] autorelease];
[denyAlert show];
}
}
Esta es la única solución de trabajo que yo sepa. Aunque los documentos oficiales dicen que UITextView se ajusta al protocolo UITextInput y que comienza en iOS 5.1, se agregaron los nuevos métodos de dictado, pero los métodos de dictado nunca se llaman directamente cuando se usa una subclase UITextView. Parece ser un error conocido de acuerdo con los foros de Apple Dev. De todos modos, ¿enviaste una aplicación usando este fragmento de código sin ningún problema? Solo trato de ahorrarme la frustración de ser rechazado. Espero que sea un error conocido, Apple podría hacer una excepción aquí ... –
Esto no funciona para iPad en realidad ... (notificación diferente) Estaba pensando el otro día que usar el altavoz de alguna manera o el servicio VOIP el registro/activación puede desactivar el botón.Me di cuenta de un error de Google Voice donde anotar se desactiva en ocasiones que podría ser la pista. – BadPirate
No veo cómo llamar al "identificador" de método no documentado en UITextInputMode no califica como API privada –