使用听写 - iOS 6 - DidStart?

Zel*_*lko 6 ios uitextinput ios6 dictation

如何回应开始听写?


回应听写的已知方法:

  • dictationRecordingDidEnd - 响应完成对口述短语的识别.

  • dictationRecognitionFailed - 响应失败的听写识别.


参考: UITextInput协议参考

从iOS 5.1开始,当用户在支持的设备上选择听写输入时,系统会自动将识别的短语插入当前文本视图中.UITextInput协议中的方法允许您的应用程序响应完成听写,如"使用听写"中所述.您可以使用UIDictationPhrase类的对象来获取表示用户已指定的短语的字符串.在不明确的听写结果的情况下,听写短语对象提供包含替代字符串的数组.

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

rob*_*off 10

据我所知,没有用于检测听写何时开始的公共API.

如果你真的想这样做,并且想要进入App Store,你可能会采用以下方法,但它完全不受支持,它可能会让你被拒绝,并且很可能会在未来中断iOS版本.

在更改到或从指令"键盘"更改之后,文本系统发布一些未记录的通知.其中两个是在修改时既公布并从它的一个变化,这些名字:

  • UIKeyboardCandidateCorrectionDidChangeNotification
  • UIKeyboardLayoutDidChangedNotification

请注意,第二个具有奇怪的动词共轭.那不是拼写错误.(好吧,这不是我的错字.)

这些通知也会在其他时间发布,因此您不能只是观察它们并假设听写状态已经改变.收到通知后,您需要进行更多检查.因此,将自己添加为其中一个通知的观察者.第一个似乎不太可能在将来消失或重命名.

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

收到通知后,您需要查看听写视图是否显示:

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

要查看它是否显示,请检查除您自己的应用程序窗口之外的每个窗口.通常,唯一的其他窗口是文本系统的窗口.

- (BOOL)isShowingDictationView {
    for (UIWindow *window in [UIApplication sharedApplication].windows) {
        if (window == self.window)
            continue;
        if (containsDictationView(window))
            return YES;
    }
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

递归地遍历视图层次结构,检查其类名称包含字符串"DictationView"的视图.实际的类名是UIDictationView但不使用整个名称,您不太可能被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;
}
Run Code Online (Sandbox Code Playgroud)


zha*_*ang 10

虽然这个问题得到了解答,但我仍然希望添加我的解决方案并希望对其他人有所帮助.

当您点击键盘上的MIC按钮时,primaryLanguage将更改为dictation.您可以像这样检测到:

[[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);
}
Run Code Online (Sandbox Code Playgroud)

更新: 就像@ user1686700所说的那样,currentInputMode已经被弃用了.这不再是解决方案.