回应听写的已知方法:
dictationRecordingDidEnd - 响应完成对口述的认可 短语。
dictationRecognitionFailed - 响应失败的听写识别。
参考: UITextInput协议参考
从iOS 5.1开始,当用户在支持的设备上选择听写输入时,系统会自动将识别的短语插入当前文本视图中。 UITextInput协议中的方法允许您的应用程序响应完成听写,如“使用听写”中所述。您可以使用UIDictationPhrase类的对象来获取表示用户已指定的短语的字符串。在不明确的听写结果的情况下,听写短语对象提供包含替代字符串的数组。
答案 0 :(得分: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];
...
当您收到通知时,您将要查看是否显示了听写视图:
- (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;
}
递归地遍历视图层次结构,检查其类名称包含字符串“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;
}
答案 1 :(得分: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);
}
<强>更新强>
正如@ user1686700所说,currentInputMode
已被弃用。这不再是解决方案。
答案 2 :(得分:4)
请注意 - 自iOS7起,UITextInputMode的 currentInputMode 已弃用。 我们可能只需等到Apple决定发布听写API,这样我们就可以按照我们的意图进行有意义的调用。