Uso de dictado – iOS 6 – DidStart?

¿Cómo responder al dictado de partida ?


Formas conocidas de responder al dictado:

  • dictationRecordingDidEnd – responde a la finalización del reconocimiento de una frase dictada.

  • dictationRecognitionFailed: responde al reconocimiento de dictado fallido .


Referencia: Referencia del protocolo UITextInput

Comenzando en iOS 5.1, cuando el usuario elige la input de dictado en un dispositivo compatible, el sistema inserta automáticamente frases reconocidas en la vista de text actual. Los methods en el protocolo UITextInput le permiten a su aplicación responder a la finalización del dictado, como se describe en "Usar dictado". Puede usar un object de la class UIDictationPhrase para get una cadena que represente una frase que el usuario haya dictado. En el caso de resultados de dictado ambiguos, un object de frase de dictado proporciona una matriz que contiene cadenas alternativas.

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

Hasta donde puedo decir, no hay una API pública para detectar cuándo se inició el dictado.

Si realmente quieres hacerlo y quieres estar en la App Store, probablemente puedas salirse con la suya con el siguiente enfoque, pero no es totalmente compatible , es posible que te rechacen de todos modos y es probable que se rompa en un futuro versión de iOS

El sistema de text publica algunas notifications no documentadas después de cambiar al o al "keyboard" de dictado. Dos de ellos se publican tanto en un cambio como en un cambio, con estos nombres:

  • UIKeyboardCandidateCorrectionDidChangeNotification
  • UIKeyboardLayoutDidChangedNotification

Tenga en count que el segundo tiene una extraña conjugación de verbos. Eso no es un error tipográfico. (Bueno, no es mi tipeo)

Estos avisos también se publican en otros momentos, por lo que no puede simplemente observarlos y asumir que el estado de dictado ha cambiado. Deberá hacer más comprobaciones cuando reciba la notificación. Entonces, añádase como observador de una de esas notifications. El primero parece less probable que desaparezca o sea retitulado en el futuro.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkForDictationKeyboard:) name:@"UIKeyboardCandidateCorrectionDidChangeNotification" object:nil]; ... 

Cuando reciba la notificación, querrá ver si la vista de dictado se muestra:

 - (void)checkForDictationKeyboard:(NSNotification *)note { if ([self isShowingDictationView]) { NSLog(@"showing dictation view"); } else { NSLog(@"not showing dictation view"); } } 

Para ver si se está mostrando, verifique cada window excepto la window de su propia aplicación. Normalmente, la única otra window es la window del sistema de text.

 - (BOOL)isShowingDictationView { for (UIWindow *window in [UIApplication shanetworkingApplication].windows) { if (window == self.window) continue; if (containsDictationView(window)) return YES; } return NO; } 

Caminar recursivamente a la jerarquía de vista para ver una vista cuyo nombre de class contiene la cadena "DictationView". El nombre real de la class es UIDictationView pero al no usar el nombre completo es less probable que sea rechazado de la App Store.

 static BOOL containsDictationView(UIView *view) { if (strstr(class_getName(view.class), "DictationView") != NULL) return YES; for (UIView *subview in view.subviews) { if (containsDictationView(subview)) return YES; } return NO; } 

Aunque se responde esta pregunta, todavía quiero agregar mi solución y deseo ser útil para alguien más.

Cuando toca el button MIC en el keyboard, primaryLanguage cambiará a dictation . Puedes detectar eso de esta manera:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleCurrentInputModeDidChange:) name:UITextInputCurrentInputModeDidChangeNotification object:nil]; - (void) handleCurrentInputModeDidChange:(NSNotification *)notification { NSString *primaryLanguage = [UITextInputMode currentInputMode].primaryLanguage; NSLog(@"current primaryLanguage is: %@", primaryLanguage); } 

ACTUALIZACIÓN: así como lo dijo @ user1686700, currentInputMode ya se ha desaprobado. Ya no es una solución.

Tenga en count: el modo actual de input de UITextInputMode está en desuso a partir de iOS7. Quizás tengamos que esperar hasta que Apple decida publicar la API de dictado para que podamos hacer las llamadas que tengan sentido según nuestras intenciones.

    Intereting Posts