web-dev-qa-db-ja.com

ユーザーが画面上のキーボードをタップした場合、どのようにキーボードを閉じることができますか?

ユーザーがキーボード以外の場所をタップしたときにiPhoneキーボードを閉じることができるようにしたい。どうすればこれを行うことができますか?レスポンダーを閉じる必要があることは知っていますが、ユーザーがキーボードスペースをタップしたときにレスポンダーを実装する方法を知る必要があります。

42
Sheehan Alam

UITapGestureRecogniserを追加してビューに割り当てる必要があり、それからセレクタのテキストフィールドでresign first responderを呼び出します。

コード:

viewDidLoad

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                      action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];

dismissKeyboard:

-(void)dismissKeyboard {
       [aTextField resignFirstResponder];
}

(aTextFieldはキーボードを担当するテキストフィールドです)

オプション2

GestureRecognizerを追加する余裕がない場合は、これを試すことができます

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];
    if(touch.phase == UITouchPhaseBegan) {
        [aTextField resignFirstResponder];
    }
}
80
visakh7

私が使用した最も簡単なソリューションはこれです:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

      [self.view endEditing:YES];

}

EndEditingコマンドは、サブフィールドとしてテキストフィールドを含む任意のビューで使用できます。この方法の他の利点は、どのテキストフィールドがキーボードをトリガーしたかを知る必要がないことです。したがって、複数のテキストフィールドがある場合でも、この行をスーパービューに追加してください。

Appleドキュメンテーションに基づいて、このメソッドはこの問題を解決するために特別に存在すると思います。

42
Taneem Tee

TapGesture Recognizerを追加しますが、cancelsTouchesInView = NOを確認してください

UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(closeTextInput)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];
[tapGesture release];
16
Matt Rees

UITapGestureRecogniserを追加してビューに割り当てる必要があります。その後、セレクターのテキストフィールドで最初のレスポンダーの辞任を呼び出します。

コード:

ViewDidLoadで

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                      action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];

DismissKeyboardで:

-(void)dismissKeyboard {
       [self.view endEditing:true];
}
2

キーボードを閉じるには、キーボードの下にサブビューとして透明なUIVIewを追加し、そこでタッチを処理する必要があります。以下のコードは参考用です。

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc]   initWithTarget:self action:@selector(overlayTouched:)]; 
gesture.delegate = self;
[(UITapGestureRecognizer *)gesture setNumberOfTouchesRequired:1];

UIView* trans = [[UIView alloc] initWithFrame:[[delegate view] bounds]];
[trans setOpaque:NO];
[trans setAutoresizingMask:UIViewAutoresizingFlexibleWidth |    UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin];
[trans setAlpha:0.3];
[trans setUserInteractionEnabled:YES];
trans.multipleTouchEnabled = YES;
[trans addGestureRecognizer:gesture];
[trans setBackgroundColor:[UIColor blackColor]];
[trans setTag:BLACK_SCREEN_VIEW];
1
Shreesh

これはSwift 4ソリューションです:

 let tap = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))

 self.view.addGestureRecognizer(tap)

そして、dismissKeyboard

@objc func dismissKeyboard() {
    self.view.endEditing(true)
}
1
Kimdv

ジェスチャーレコグナイザーを追加したくない場合は、touchesBeginメソッドも使用できます。

コード入力Swift 4

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { view.endEditing(true) }

0
Anu Mittal

UITableViewControllerを使用している場合、またはユーザーが対話するUITableViewを持っている場合、ViewDidLoadで簡単に実行できます。

tableView.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag;

注:これはXamarin.iOSの構文です。

0
Adam Hockemeyer

他の方法は簡単です:

UIView as UIControl in custom class in the interface builderを作成し、Touch up inside eventUIView : UIControlIBActionメソッドをアタッチして、[yourTextField resignFirstResponder]内にIBAction methodを挿入できます。この:

- (IBAction) hideKeyboard: (id) sender
{
    // If you have more than one textfield to dismiss, of course only can be active 1, but here you can't know who is it, because sender will be the UIView : UIControl
    [alias resignFirstResponder];
    [password resignFirstResponder];
}

次に、他のオプションがあり、インターフェイスビルダーにテキストフィールドthe return key of the keyboard as Done(必要なものはどれでもかまいませんが、Doneはこれに適しています。リターンはフォームでアクションを実行することを意味するため) 、[Doneを押してキーボードを非表示にすることができますが、その場合は、以前のIBActionメソッドをDid end on exitイベントにアタッチする必要があります。

このようにして、キーボードはキーボードからtouching outsideを非表示にするか、Doneに触れます。

コードを改善したい場合、キーボードからDoneに触れているキーボードのみを非表示にする場合、メソッドは次のようになります。

// Attach all textFields here on Did end on exit event, will not work if touch outside the keyboard
- (IBAction) hideKeyboard: (id) sender
{
      [sender resignFirstResponder];
}
0
rokimoki