UITextField
之外的区域时,键盘自动消失。UITextField
之外的区域时,键盘自动消失。我认为最简单(也是最好的)方法是创建一个子类全局视图,并使用hitTest:withEvent
方法监听任何触摸事件。键盘上的触摸不会被注册,因此只有当您在其他地方触摸/滚动/划动/捏合...时,才会调用hitTest:withEvent方法,然后调用[self endEditing:YES]
。
这比使用touchesBegan
更好,因为如果您单击视图顶部的按钮,则不会调用touchesBegan
。它比UITapGestureRecognizer
更好,例如无法识别滚动手势。它也比使用暗屏幕更好,因为在复杂和动态的用户界面中,您无法将暗屏幕放置到每个位置。此外,它不会阻止其他操作,您不需要两次轻敲才能选择外部的按钮(例如使用UIPopover
时需要)。
此外,它比调用[textField resignFirstResponder]
更好,因为屏幕上可能有许多文本字段,所以这适用于所有文本字段。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
UIScrollView
中嵌入,那么您可以使用以下方法:tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
前者将在滚动表视图时使键盘离开屏幕,后者将像原生消息应用程序一样隐藏键盘。
请注意,这些功能仅适用于iOS 7.0或更高版本。
将以下内容添加到您的ViewController使用的类的头文件中:
@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>
- (IBAction)dissmissKeyboardOnTap:(id)sender;
@end
然后将以下内容添加到同一ViewController的实现文件中:
- (IBAction)dissmissKeyboardOnTap:(id)sender{
[[self view]endEditing:YES];
}
现在,您需要将此操作连接到触发键盘的用户手势上。
重要提示 - 您需要将故事板中包含的 'UIView' 转换为 'UIControl',以便它可以接收事件。从您的视图控制器场景层次结构中选择视图:
...并更改它的类:
现在,从您场景旁边的小圆圈处拖动“接收操作”,拖到场景的“空白”部分(实际上是将“接收操作”拖到UIControl上)。然后,您将看到一系列事件可供选择,可以将您的操作连接到其中之一。 选择“touch up inside”选项。现在,您已经将所创建的IBAction钩到了触发键盘关闭的用户操作上。当用户点击键盘时,它将被隐藏。textfield
外部时取消键盘,但是您没有textfield
的引用。reftextField
Now in textFieldDidBeginEditing
set referenced text field to
- (void) textFieldDidBeginEditing:(UITextField *)textField{
reftextField = textField;
}
Now you can happily use on any button clock, (adding a transparent button on begin editing recomended)
- (void)dismissKeyboard {
[reftextField resignFirstResponder];
}
Or for resigning done button try this.
//for resigning on done button
- (BOOL) textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
override func viewDidLoad() {
// ... code
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard(_:)))
self.view.addGestureRecognizer(tapGesture)
}
@objc func dismissKeyboard(_ sender: UITapGestureRecognizer) {
self.view.endEditing(true)
}
tableViews
或collectionViews
,请将以下内容作为tapGesture
配置的一部分包括进去:tapGesture.cancelsTouchesInView = false
。 - cro在此补充一下如何通过触摸屏幕外部来关闭键盘的方法。
viewDidLoad:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
无处不在:
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
[textFieldName resignFirstResponder];
puts("Dismissed the keyboard");
}
Objective-C:
将下面的代码添加到您的ViewController.m 文件中:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
Swift:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
您可以为UiView创建类别,并如下覆盖touchesBegan方法。
对我来说,它的工作很好。这是解决此问题的集中化解决方案。
#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.window endEditing:true];
[super touchesBegan:touches withEvent:event];
}
@end
@Jensen2k的答案的Swift版本:
let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)
func dismissKeyboard() {
aTextField.resignFirstResponder()
}
一句话简述
self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))