私の知る限り、ディクテーションがいつ開始されたかを検出するためのパブリックAPIはありません。
本当にやりたいと思っていて、App Storeに参加したい場合は、おそらく次のアプローチで解決できますが、完全にサポートされていないため、とにかく拒否される可能性があり、将来的に破損する可能性がありますiOSのバージョン。
テキストシステムは、ディクテーション「キーボード」に変更した後、またはディクテーション「キーボード」から変更した後、文書化されていない通知を投稿します。それらのうちの2つは、次の名前で、変更と変更の両方で投稿されます。
UIKeyboardCandidateCorrectionDidChangeNotification
UIKeyboardLayoutDidChangedNotification
2番目のものには奇妙な動詞の活用があることに注意してください。それはタイプミスではありません。(まあ、それは私のタイプミスではありません。)
これらの通知は他の時間にも投稿されるため、単にそれらを観察してディクテーション状態が変更されたと想定することはできません。通知を受け取ったら、さらにチェックを行う必要があります。したがって、これらの通知の1つのオブザーバーとして自分自身を追加します。最初のものは、なくなるか、将来名前が変更される可能性が低いようです。
- (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
、名前全体を使用しないことで、AppStoreから拒否される可能性が低くなります。
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;
}