如何应对开始的命令?

响应听写的已知方法:

  • dictationRecordingDidEnd-响应听写命令的识别完成
    短语。
  • dictationRecognitionFailed-响应失败的听写识别。

  • 引用: UITextInput协议(protocol)引用
    从iOS 5.1开始,当用户在支持的设备上选择听写输入时,系统会自动将识别出的短语插入当前文本 View 。 UITextInput协议(protocol)中的方法允许您的应用响应听写的完成,如“使用听写”中所述。您可以使用UIDictationPhrase类的对象来获取表示用户指示的短语的字符串。在听写结果模棱两可的情况下,听写短语对象会提供一个包含备用字符串的数组。
    http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextInput_Protocol/Reference/Reference.html

    最佳答案

    据我所知,没有公共(public)API可以检测命令开始的时间。

    如果确实想要,并且想进入App Store,则可以采用以下方法,但是完全不受支持,可能会让您无论如何拒绝可能会在iOS的 future 版本中破坏。

    在更改为听写“键盘”或从听写“键盘”更改后,文本系统会发布一些未记录的通知。其中的两个名称分别是更改名称和更改名称,它们分别是:

  • UIKeyboardCandidateCorrectionDidChangeNotification
  • UIKeyboardLayoutDidChangedNotification

  • 请注意,第二个有一个奇怪的动词词缀。那不是错字。 (嗯,这不是我的错字。)

    这些通知也会在其他时间发布,因此您不能仅观察它们并假定听写状态已更改。收到通知时,您需要做更多检查。因此,将您自己添加为这些通知之一的观察者。第一个似乎不太可能在将来消失或重命名。
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(checkForDictationKeyboard:)
            name:@"UIKeyboardCandidateCorrectionDidChangeNotification"
            object:nil];
        ...
    

    收到通知时,您需要查看听写 View 是否正在显示:
    - (void)checkForDictationKeyboard:(NSNotification *)note {
        if ([self isShowingDictationView]) {
            NSLog(@"showing dictation view");
        } else {
            NSLog(@"not showing dictation view");
        }
    }
    

    要查看是否正在显示,请检查除您自己的应用程序窗口以外的每个窗口。通常,唯一的另一个窗口是文本系统的窗口。
    - (BOOL)isShowingDictationView {
        for (UIWindow *window in [UIApplication sharedApplication].windows) {
            if (window == self.window)
                continue;
            if (containsDictationView(window))
                return YES;
        }
        return NO;
    }
    

    递归遍历 View 层次结构,以检查其类名称包含字符串“DictationView”的 View 。实际的类名称为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;
    }
    

    关于ios - 使用听写功能-iOS 6-DidStart?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15024056/

    10-14 21:41