Soweit ich das beurteilen kann, gibt es keine öffentliche API zum Erfassen, wenn Diktat begonnen hat.
Wenn Sie wirklich es tun wollen, und Sie wollen in den App Store sein, können Sie wahrscheinlich mit dem folgenden Ansatz weg, aber es ist völlig ungestützt, es könnte erhalten Sie abgelehnt sowieso und ist es wahrscheinlich, in einer zukünftigen Version von iOS zu brechen.
Das Textsystem sendet einige undokumentierte Benachrichtigungen nach Änderung an oder aus dem Diktat "Tastatur". Zwei von ihnen gebucht wird sowohl auf einer Änderung, um es und eine Änderung von ihm, mit diesem Namen:
UIKeyboardCandidateCorrectionDidChangeNotification
UIKeyboardLayoutDidChangedNotification
Beachten Sie, dass der zweite eine seltsame Konjugation hat . Das ist kein Tippfehler. (Nun, es ist nicht mein Tippfehler.)
Diese Hinweise werden auch zu anderen Zeiten gepostet, so dass Sie nicht nur beobachten können und davon ausgehen, dass der Diktatstatus geändert hat. Sie müssen mehr Prüfungen durchführen, wenn Sie die Benachrichtigung erhalten. Fügen Sie sich als Beobachter einer dieser Benachrichtigungen hinzu. Die erste scheint weniger wahrscheinlich wegzugehen oder in Zukunft umbenannt zu werden.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(checkForDictationKeyboard:)
name:@"UIKeyboardCandidateCorrectionDidChangeNotification"
object:nil];
...
Wenn Sie die Meldung erhalten, werden Sie sehen wollen, ob das Diktat Ansicht zeigt:
- (void)checkForDictationKeyboard:(NSNotification *)note {
if ([self isShowingDictationView]) {
NSLog(@"showing dictation view");
} else {
NSLog(@"not showing dictation view");
}
}
Um zu sehen, ob es zeigt, überprüfen Sie jedes Fenster außer Ihrer eigenen Anwendungsfenster. Normalerweise ist das einzige andere Fenster das Fenster des Textsystems.
- (BOOL)isShowingDictationView {
for (UIWindow *window in [UIApplication sharedApplication].windows) {
if (window == self.window)
continue;
if (containsDictationView(window))
return YES;
}
return NO;
}
Recursively die Ansicht Hierarchie gehen für einen Blick überprüft, deren Klassennamen enthält die Zeichenfolge „DictationView“. Der tatsächliche Klassenname lautet UIDictationView
. Wenn Sie jedoch nicht den gesamten Namen verwenden, werden Sie weniger wahrscheinlich aus dem App Store abgelehnt.
Große Lösung. – AriX
Ich könnte eine gute Lösung sein, aber es funktioniert nicht, siehe [meine Frage] (http://Stackoverflow.com/q/24041181/1387438), mit dieser Lösung kann ich immer noch nicht crash loswerden. –