web-dev-qa-db-ja.com

キーボードが消えないようにする方法はありますか?

これはほとんどの投稿の逆であることに気づきましたが、キーボードを上げたままにしておきたいです「キーボードダウン」ボタンが押されても

具体的には、2つのUITextFieldsを持つビューがあります。次のデリゲートメソッドを使用

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    return NO;
}

ユーザーがキーボードのDoneボタンを押したり、キーボードの右下にある厄介なキーボード下ボタンを除いて画面上の他の場所をタップしたりしても、キーボードを上げたままにすることができます。

私はこのビューをモーダルビューのように使用しているので(ビューはUINavigationControllerにプッシュされるViewControllerに関連付けられていますが)、ユーザーの観点からは常にキーボードを上げたままにしておくのが最適です。誰かがこれを達成する方法を知っているなら、私に知らせてください!ありがとう!

[〜#〜] update [〜#〜]まだ解決策はありません! Doneを押すとtextFieldShouldReturnがトリガーされますが、Dismissボタンを押すとtextFieldDidEndEditingがトリガーされます。 textFieldが編集を終了するのをブロックできないか、決してが消えます。どういうわけか、私は本当にDismissボタンを検出してそれを無視するメソッドが欲しいのです。方法を知っているなら、私に教えてください!

27
PengOne

ISこれを行う方法があります。UIKeyboardサブクラスのためUIWindowUIKeyboardの邪魔をするのに十分な大きさの唯一のものは、別のUIWindowです。

- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(coverKey) name:UIKeyboardDidShowNotification object:nil];
    [super viewDidLoad];
}

- (void)coverKey {
    CGRect r = [[UIScreen mainScreen] bounds];
    UIWindow *myWindow = [[UIWindow alloc] initWithFrame:CGRectMake(r.size.width - 50 , r.size.height - 50, 50, 50)];
    [myWindow setBackgroundColor:[UIColor clearColor]];
    [super.view addSubview:myWindow];
    [myWindow makeKeyAndVisible];
}

これはiPhoneアプリで機能します。 iPadで試したことはありません。 myWindowのサイズを調整する必要があるかもしれません。また、myWindowではmem管理を行いませんでした。だから、それも検討してください。

11
Jacob Barnard

私は良い解決策を見つけたと思います。

BOOLをインスタンス変数として追加し、それをshouldBeginCalledBeforeHandと呼びましょう。

次に、次のメソッドを実装します。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    shouldBeginCalledBeforeHand = YES;
    return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    return shouldBeginCalledBeforeHand;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    shouldBeginCalledBeforeHand = NO;
}

と同様

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    return NO;
}

キーボードが戻るボタンで消えないようにするため。秘訣は、あるテキストフィールドから別のテキストフィールドへのフォーカス切り替えにより、事前にtextFieldShouldBeginEditingがトリガーされることです。キーボードの閉じるボタンが押された場合、これは起こりません。テキストフィールドがフォーカスを取得すると、フラグはリセットされます。

7
Nick Weaver

古い完璧ではない解決策

私は完璧ではない解決策しか考えられません。通知UIKeyboardDidHideNotificationを聞いて、テキストフィールドのファーストレスポンダーをもう一度作成します。これにより、キーボードが見えなくなり、再び元に戻ります。 UIKeyboardWillHideNotificationをリッスンし、didHideでそれに焦点を当てることで、どのテキストフィールドが最後のfirstResponderであったかを記録できます。

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidHide:) 
                                             name:UIKeyboardDidHideNotification
                                           object:nil];

...

- (void)keyboardDidHide:(id)sender
{
    [myTextField becomeFirstResponder];
}
3
Nick Weaver

IOS9/10およびSwift 3の場合、これを使用して、「キーボードを非表示」に重なる長方形を作成します-ボタン

override func viewDidLoad() {
    NotificationCenter.default.addObserver(self, selector: #selector(coverKey), name: .UIKeyboardDidShow, object: nil)
}

func coverKey() {
    if let keyboardWindow = UIApplication.shared.windows.last {
        let r = UIScreen.main.bounds
        let myWindow = UIWindow.init(frame: CGRect(x: r.size.width - 50 , y: r.size.height - 50, width: 50, height: 50))
        myWindow.backgroundColor = UIColor.clear
        myWindow.isHidden = false
        keyboardWindow.addSubview(myWindow)
        keyboardWindow.bringSubview(toFront: myWindow)
    }
} 

これにより、メインウィンドウではなくキーボードウィンドウにサブビューが追加されることに注意してください。

1
pugrish

キーボードの閉じるボタンの上にカスタムを追加して、ユーザーが閉じるボタンをタブで移動できないようにしてください。私は自分のアプリケーションの1つでこの方法を使用しました。

- (void)addButtonToKeyboard {

    // create custom button
    UIButton *blockButton = [UIButton buttonWithType:UIButtonTypeCustom];
    blockButton.frame = //set the frame here, I don't remember the exact frame
    [blockButton setImage:[UIImage imageNamed:@"block_button.png"] forState:UIControlStateNormal];

    // locate keyboard view
    UIWindow *appWindows = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    UIView *keyboard;
    for (int i=0; i<[appWindows.subviews count]; i++) {
        keyboard = [appWindows.subviews objectAtIndex:i];
        // keyboard found, add the button
        if ([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES && [self.textField isFirstResponder]) {
            [keyboard addSubview:doneButton];

        }
    }

}
0
Nithin