Насколько я могу сказать, что нет никакого публичного 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;
}
Отличное решение. – AriX
Я мог бы быть отличным решением, но он не работает, см. [Мой вопрос] (http://stackoverflow.com/q/24041181/1387438), с этим решением я все еще не могу избавиться от сбоя. –