how to hide the keyboard when empty area is touched on iphone
Asked Answered
T

11

71

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

Transcontinental answered 29/4, 2009 at 22:28 Comment(0)
K
114

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.

Kutuzov answered 30/4, 2009 at 2:35 Comment(3)
Short cut found on another post: [self.view endEditing:YES]; will end editing in all subviews and resign first responder. Its a lot more clear than enumerating all of your text boxes and won't break when you add fields later!Interaction
Thanks to HitScan for elaboration and Many Thanks to Peter to share the shortcut with us!!Kings
On the first solution, touchesBegan:withEvent: shouldn't be calling [super touchesBegan:touches withEvent:event]?Lesh
B
73

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.

Brummell answered 8/3, 2012 at 14:10 Comment(4)
Simple & elegant solution.. Works like charm!Venose
How do I use this? I have a ViewController but it's never called. So do I have to subclass UIView and override this method, and then in the IB make my view of this subclass?Wymore
@Rob just add your code in you viewcontroller.m no linking with view required. It should workBrummell
All around the web, this is the only bug free solution (most others cause conflict with buttons not calling their selectors) and most elegant between them all, I salute youOrlop
S
16

Forget about putting a button in the background there simple solution

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.textfieldName resignFirstResponder];
}
Socman answered 19/11, 2011 at 17:39 Comment(2)
This is a much cleaner solution than the top answer for this question!Lauro
how do I make this work if the textfield is in a tableViewCell?Chanson
D
4

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];
Dashtikavir answered 29/4, 2009 at 22:28 Comment(0)
J
4

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

Joettajoette answered 29/7, 2009 at 11:5 Comment(0)
S
2

Send resignFirstResponder to the control.

Sergius answered 29/4, 2009 at 23:44 Comment(0)
L
1

You can do this way also

Hide keyBoard by touching background in view

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}
Leclerc answered 5/8, 2014 at 8:3 Comment(0)
O
1

The Following code works fine with xamarin iOS project :

public override void TouchesBegan (NSSet touches, UIEvent evt){
    View.EndEditing (true);
}
Obaza answered 2/2, 2015 at 11:40 Comment(0)
M
0

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.

Mignon answered 26/7, 2011 at 23:13 Comment(0)
M
0

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]; 
}
Merriemerrielle answered 12/7, 2012 at 2:51 Comment(0)
F
0

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)
    }
Forefinger answered 12/6, 2015 at 21:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.