如何应对开始的命令?
响应听写的已知方法:
短语。
引用: 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/