how to hide the keyboard when empty area is touche

2019-01-10 06:03发布

问题:

normally when you touch the text input area, the keyboard pops up and when you touch the empty area of screen, the keyboard disappeared. How to make that happen?

just like what we experienced on iphone safari...

Thank you

回答1:

Updated way (recommended):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
   [self.view endEditing:YES];
}

This will end editing on all subviews and resign the first responder.

Other way (enumerating over all text views):

Here's a step by step for it:

Add an IBAction to your view controller, such as - (IBAction)backgroundTouch:(id)sender

In the backgroundTouch action, you need to send the resignFirstResponder message to all of the text boxes in your view. This is unfortunate but necessary since there's currently no way to retrieve the object that currently has FirstResponder status. It should look something like this:

- (IBAction)backgroundTouch:(id)sender {
  [someTextBox resignFirstResponder];
  [anotherTextBox resignFirstResponder];
}

Add a button control to the view, size it to cover the entire visible area (except for the status bar or any tab or navigation controllers). Select the button and then go to the Layout Menu and select Send To Back. Also set the button's Type to custom, which is invisible if you don't specifically supply any drawing code for it.

Connect the Button's Touch Up Inside event to the backgroundTouch: action and try it out.



回答2:

Use this simple Solution

For Swift 4 :

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

For Swift 2 :

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

For Objective C :

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
   [self.view endEditing:YES];
}  

Works with UITextField, UITextView and all subviews.



回答3:

Forget about putting a button in the background there simple solution

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.textfieldName resignFirstResponder];
}


回答4:

there's a tutorial about that problem (also concerning the numerical keyboard with no DONE key) over here



回答5:

For > iOS 4.0 there is another solution (and maybe better) With this code, single tap anywhere in view to hide keyboard.

// single tap to resign keyboard
UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithBlock:^(UIGestureRecognizer *rec){
            [input_text resignFirstResponder];
        }];
self.singleTapRecognizer.numberOfTapsRequired = 1;
self.singleTapRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:singleTapRecognizer];


回答6:

Send resignFirstResponder to the control.



回答7:

The Following code works fine with xamarin iOS project :

public override void TouchesBegan (NSSet touches, UIEvent evt){
    View.EndEditing (true);
}


回答8:

You can do this way also

Hide keyBoard by touching background in view

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}


回答9:

I was having this problem too, it was very annoying. But I figured out how to get rid of the keyboard on accident. Say you are texting John, and there's a keyboard in the way from you viewing your conversations and therefore reducing the screen you can see. Well then click on messages in the uppwer left, then select a different person you have a record of texting with, then hit messages again in the upper left. Then go back and select John. No you're back at the conversation with John, by the keyboard is gone. Seams like a lot but it's pretty quick. You'd think they'd just put a hide button to on the keyboard lol Hope that helps, or was clear enough.



回答10:

I could not compile Val's answer above using the 'initWithBlock:' selector.

This code works for me. Add this to the method defining the view - note that my view is composed and the subview that I want to respond to the single tap is 'chatView'. The input field view that uses the keyboard is named 'chatInput'.

    // single tap to resign (hide) the keyboard
    UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
    singleTapRecognizer.numberOfTouchesRequired = 1;
    singleTapRecognizer.cancelsTouchesInView = NO;
    [chatContent addGestureRecognizer:singleTapRecognizer];

Then add the tap-handling method.

/**
 * Handles a recognized single tap gesture.
 */
- (void) handleTapFrom: (UITapGestureRecognizer *) recognizer {
    // hide the keyboard
    NSLog(@"hiding the keyboard");
    [chatInput resignFirstResponder]; 
}


回答11:

This solution should work fine if you are working with swift and iOS 8/9:

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
         self.view.endEditing(true)
    }