20

私たちのものはヘルスケアアプリです。アプリには、すべてのディクテーションを実行できる HIPAA 準拠の音声認識エンジンがあります。病院は、医師が HIPAA に準拠していない Nuance Dragon サーバーに誤って話しかけてしまうことを望んでいません。そこで、キーボードのディクテーション キーを無効にする方法を探していました。

キーパッドの Dictation ボタンに偽のボタンを配置してみましたが、iPad では分割ドックのコンセプトによりマイクが画面全体に移動し続けます。これは合理的な解決策とは思えません。私を助けてくれる専門家はいますか?

4

5 に答える 5

14

よし、やっと手に入れた!秘訣は、UITextInputMode の変更通知を観察し、変更されたモードの識別子を収集することです (コードはプライベート API の直接使用を避けているようですが、一般的にプライベート API の知識が少し必要なようです)。ディクテーションには、resignFirstResponder (音声ディクテーションをキャンセルします)。わーい!ここにいくつかのコードがあります:

アプリのデリゲートのどこかに (少なくとも私はそこに置きました)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputModeDidChange:) name:@"UITextInputCurrentInputModeDidChangeNotification"
                                           object:nil];

そして、あなたはすることができます

UIView *resignFirstResponder(UIView *theView)
{
    if([theView isFirstResponder])
    {
        [theView resignFirstResponder];
        return theView;
    }
    for(UIView *subview in theView.subviews)
    {
        UIView *result = resignFirstResponder(subview);
        if(result) return result;
    }
    return nil;
}

- (void)inputModeDidChange:(NSNotification *)notification
{        
    // Allows us to block dictation
    UITextInputMode *inputMode = [UITextInputMode currentInputMode];
    NSString *modeIdentifier = [inputMode respondsToSelector:@selector(identifier)] ? (NSString *)[inputMode performSelector:@selector(identifier)] : nil;

    if([modeIdentifier isEqualToString:@"dictation"])
    {
        [UIView setAnimationsEnabled:NO];
        UIView *resigned = resignFirstResponder(window);
        [resigned becomeFirstResponder];
        [UIView setAnimationsEnabled:YES];

        UIAlertView *denyAlert = [[[UIAlertView alloc] initWithTitle:@"Denied" message:nil delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil] autorelease];
        [denyAlert show];
    }
}
于 2012-08-22T18:21:58.980 に答える
10

独自のキーボードを作成し、このディクテーションを受け入れるテキスト フィールドの inputView を設定できます。その後、彼らが任意のキーを押すと、キーボードが取得されるため、標準キーボードのキーをオーバーライドする必要はありません。全体をカスタマイズできます。

self.myButton.inputView = self.customKeyboardView;

これは非常にカスタムなキーボードの例です

http://blog.carbonfive.com/2012/03/12/customizing-the-ios-keyboard/

Ray には、カスタム キーボードに関するすばらしいチュートリアルもあります。

http://www.raywenderlich.com/1063/ipad-for-iphone-developers-101-custom-input-view-tutorial

それが役立つことを願っています。

于 2012-08-22T18:33:48.737 に答える
9

同じ問題があり、口述ボタンを非表示にする唯一の方法は、キーボードの種類を変更することです。私にとって、それを電子メールタイプに変更することは合理的であるように思われました:

textField.keyboardType = UIKeyboardTypeEmailAddress;
于 2014-12-25T09:37:35.263 に答える
1

insertDictationResult: をオーバーライドする UITextField/UITextView のサブクラスを作成して、何も挿入しないようにすることができます。

これによって情報の送信が妨げられることはありませんが、違反を知らせるアラートを表示できます。

于 2012-08-22T18:54:01.620 に答える
0

これは、@BadPirate のハックに基づく Swift 4 ソリューションです。ディクテーションが開始されたことを示す最初のベル音がトリガーされますが、ディクテーション レイアウトがキーボードに表示されることはありません。

これは、キーボードからディクテーション ボタンを非表示にしません。そのため、唯一のオプションは、UIKeyboardType.emailAddressで電子メール レイアウトを使用することのようです。


ディクテーションを無効にする を所有viewDidLoadしているビュー コントローラで:UITextField

// Track if the keyboard mode changed to discard dictation
NotificationCenter.default.addObserver(self,
                                       selector: #selector(keyboardModeChanged),
                                       name: UITextInputMode.currentInputModeDidChangeNotification,
                                       object: nil)

次に、カスタム コールバック:

@objc func keyboardModeChanged(notification: Notification) {
    // Could use `Selector("identifier")` instead for idSelector but
    // it would trigger a warning advising to use #selector instead
    let idSelector = #selector(getter: UILayoutGuide.identifier)

    // Check if the text input mode is dictation
    guard
        let textField = yourTextField as? UITextField
        let mode = textField.textInputMode,
        mode.responds(to: idSelector),
        let id = mode.perform(idSelector)?.takeUnretainedValue() as? String,
        id.contains("dictation") else {
            return
    }

    // If the keyboard is in dictation mode, hide
    // then show the keyboard without animations
    // to display the initial generic keyboard
    UIView.setAnimationsEnabled(false)
    textField.resignFirstResponder()
    textField.becomeFirstResponder()
    UIView.setAnimationsEnabled(true)

    // Do additional update here to inform your
    // user that dictation is disabled
}
于 2018-11-20T18:43:23.690 に答える