Насколько я могу судить, нет общедоступного 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;
}
person
rob mayoff
schedule
26.02.2013