iOS - Dismiss keyboard when touching outside of UI

2019-01-01 01:37发布

I'm wondering how to make the keyboard disappear when the user touches outside of a UITextField.

30条回答
一个人的天荒地老
2楼-- · 2019-01-01 02:04

If the view is embedded at all in a UIScrollView then you can use the following:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

The former will animate the keyboard off screen when the table view is scrolled and the later will hide the keyboard like the stock Messages app.

Note that these are are available on iOS 7.0 or above.

查看更多
不流泪的眼
3楼-- · 2019-01-01 02:05

I see that some people are having issues using the UITapGestureRecognizer method. The easiest way that I've accomplished this functionality while still leaving my existing button's tap behavior intact is adding only one line to @Jensen2k 's answer:

[tap setCancelsTouchesInView:NO];

This allowed my existing buttons to still work without using @Dmitry Sitnikov 's method.

Read about that property here (search for CancelsTouchesInView): UIGestureRecognizer Class Reference

I'm not sure how it would work with scrollbars, as I see some had issues with, but hopefully someone else might run into the same scenario I had.

查看更多
忆尘夕之涩
4楼-- · 2019-01-01 02:05

Send message resignFirstResponder to the textfiled that put it there. Please see this post for more information.

查看更多
路过你的时光
5楼-- · 2019-01-01 02:06

Swift 4

Setup your UIViewController with this extension method once e.g in viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setupHideKeyboardOnTap()
}

and the keyboard will be dismissed even by tapping on the NavigationBar.

import UIKit
extension UIViewController {
    /// Call this once to dismiss open keyboards by tapping anywhere in the view controller
    func setupHideKeyboardOnTap() {
        self.view.addGestureRecognizer(self.endEditingRecognizer())
        self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer())
    }

    /// Dismisses the keyboard from self.view
    private func endEditingRecognizer() -> UIGestureRecognizer {
        let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:)))
        tap.cancelsTouchesInView = false
        return tap
    }
}
查看更多
梦醉为红颜
6楼-- · 2019-01-01 02:06

Swift version of @Jensen2k's answer:

let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)

func dismissKeyboard() {
    aTextField.resignFirstResponder()
}

One liner

self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))
查看更多
几人难应
7楼-- · 2019-01-01 02:09

You can do this using the Storyboard in XCode 6 and above:


Create the action to hide the keyboard

Add this to the header file of the class used by your ViewController:

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>

- (IBAction)dissmissKeyboardOnTap:(id)sender;

@end

Then add this to the implementation file of the same ViewController:

- (IBAction)dissmissKeyboardOnTap:(id)sender{
    [[self view]endEditing:YES];
}

This will now be one of the 'Received Actions' for your storyboard scene (i.e. ViewController):

enter image description here


Hook up the action to the user event

Now you need to hook up this action to the user gesture of touching off the keyboard.

Important - You need to convert the 'UIView' that's contained in your storyboard to a UIControl, so it can receive events. Select the view from your View Controller Scene hierarchy:

enter image description here

...and change its class:

enter image description here

Now drag from the small circle next to the 'received action' for your scene, onto an 'empty' part of your scene (actually you're dragging the 'Received Action' to the UIControl). You'll be shown a selection of events that you can hook up your action to:

enter image description here

Select the 'touch up inside' option. You've now hooked the IBAction you created to a user action of touching off the keyboard. When the user taps off the keyboard, it will now be hidden.

(NOTE: To hook the action to the event, you can also drag from the received action directly onto the UIControl in your View Controllers hierarchy. It's displayed as 'Control' in the hierarchy.)

查看更多
登录 后发表回答