ios学习之 点击屏幕任何地方隐藏键盘实现 目前感觉最好用的
2015-03-13 18:05
369 查看
在iOS开发中,对UITextField进行编辑的时候键盘会自己弹出来。在编辑完成的时候,需要将键盘隐藏掉。隐藏键盘有很多种实现方法,最常见的是把TextField的firstResponder resign掉。即[textField resignFirstResponder]。本文介绍的是如何在键盘显示的时候,点击屏幕除了键盘以外的任何地方,将键盘隐藏。
基本思想如下:
1. 在ViewController载入的时候,将键盘显示和消失的Notification添加到self.view里。
2. 分别在键盘显示和消失时添加和删除TapGestureRecognizer
就这么简单。
示例代码如下:
UIViewController的源代码里:
- (void)viewDidLoad
{
[super viewDidLoad];
[self setUpForDismissKeyboard];
}
- (void)setUpForDismissKeyboard {
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
UITapGestureRecognizer *singleTapGR =
[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(tapAnywhereToDismissKeyboard:)];
NSOperationQueue *mainQuene =[NSOperationQueue mainQueue];
[nc addObserverForName:UIKeyboardWillShowNotification
object:nil
queue:mainQuene
usingBlock:^(NSNotification *note){
[self.view addGestureRecognizer:singleTapGR];
}];
[nc addObserverForName:UIKeyboardWillHideNotification
object:nil
queue:mainQuene
usingBlock:^(NSNotification *note){
[self.view removeGestureRecognizer:singleTapGR];
}];
}
- (void)tapAnywhereToDismissKeyboard:(UIGestureRecognizer *)gestureRecognizer {
//此method会将self.view里所有的subview的first responder都resign掉
[self.view endEditing:YES];
这是其中一个典型的做法。其他的的做法,例如在textField becomeFirstResponder 后加入UIControl在顶层,然后当UIControl被点击的时候将其移除并且将field resign。
但是这样做也有一些后遗症。譬如field点击(譬如select all,移动光标)以及其他控件的点击(scroller的拖动等等)也会被屏蔽。
因此要改进的话,可能需要在tapAnywhereToDismissKeyboard:中判断是点击的位置是否应该由下面它的控件(譬如location是否被field的frame包含)来进行反应。
另外,我们往往不希望一切都在controller上实现,因为这要为每处需要同样的效果的地方都使用重复的一套代码。如果能用控件自己来实现,那就更好了。所以我们通过继承UITextField并重写它的-becomeFirstResponder 和 -resignFirstResponder。这样可能用起来更舒服。
然而,事实上要 实现点击field的外围来resign 又同时希望保留的某些控件行为 还是不太容易实现。因此,另外一种选择是,为return key定义确切的行为:1.跳转到下一个field,2.放弃firstResponder。
Reply ↓
匿名on 2013
年 05 月 26 日 at 01:01 said:
很好很强大,这种方法是我觉得目前最好的方法。很奇怪的是按理说其他控件的点击也会被屏蔽掉,但是我点击其他控件时,都可以正确的响应,并没有被屏蔽掉。虽然是我想要的结果,但是对此依然不理解…
Reply ↓
基本思想如下:
1. 在ViewController载入的时候,将键盘显示和消失的Notification添加到self.view里。
2. 分别在键盘显示和消失时添加和删除TapGestureRecognizer
就这么简单。
示例代码如下:
UIViewController的源代码里:
- (void)viewDidLoad
{
[super viewDidLoad];
[self setUpForDismissKeyboard];
}
- (void)setUpForDismissKeyboard {
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
UITapGestureRecognizer *singleTapGR =
[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(tapAnywhereToDismissKeyboard:)];
NSOperationQueue *mainQuene =[NSOperationQueue mainQueue];
[nc addObserverForName:UIKeyboardWillShowNotification
object:nil
queue:mainQuene
usingBlock:^(NSNotification *note){
[self.view addGestureRecognizer:singleTapGR];
}];
[nc addObserverForName:UIKeyboardWillHideNotification
object:nil
queue:mainQuene
usingBlock:^(NSNotification *note){
[self.view removeGestureRecognizer:singleTapGR];
}];
}
- (void)tapAnywhereToDismissKeyboard:(UIGestureRecognizer *)gestureRecognizer {
//此method会将self.view里所有的subview的first responder都resign掉
[self.view endEditing:YES];
2 COMMENTS ON “IOS开发中,点击屏幕任何地方隐藏键盘的一种实现方案”
这是其中一个典型的做法。其他的的做法,例如在textField becomeFirstResponder 后加入UIControl在顶层,然后当UIControl被点击的时候将其移除并且将field resign。但是这样做也有一些后遗症。譬如field点击(譬如select all,移动光标)以及其他控件的点击(scroller的拖动等等)也会被屏蔽。
因此要改进的话,可能需要在tapAnywhereToDismissKeyboard:中判断是点击的位置是否应该由下面它的控件(譬如location是否被field的frame包含)来进行反应。
另外,我们往往不希望一切都在controller上实现,因为这要为每处需要同样的效果的地方都使用重复的一套代码。如果能用控件自己来实现,那就更好了。所以我们通过继承UITextField并重写它的-becomeFirstResponder 和 -resignFirstResponder。这样可能用起来更舒服。
然而,事实上要 实现点击field的外围来resign 又同时希望保留的某些控件行为 还是不太容易实现。因此,另外一种选择是,为return key定义确切的行为:1.跳转到下一个field,2.放弃firstResponder。
Reply ↓
匿名on 2013
年 05 月 26 日 at 01:01 said:
很好很强大,这种方法是我觉得目前最好的方法。很奇怪的是按理说其他控件的点击也会被屏蔽掉,但是我点击其他控件时,都可以正确的响应,并没有被屏蔽掉。虽然是我想要的结果,但是对此依然不理解…
Reply ↓
相关文章推荐
- ios学习之 点击屏幕任何地方隐藏键盘实现 目前感觉最好用的
- ios学习之 点击屏幕任何地方隐藏键盘实现 目前感觉最好用的
- IOS开发中让点击屏幕任何地方可以隐藏键盘的方法
- iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法
- iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法
- IOS上点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法
- iOS 常用:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法
- iOS 点击屏幕空白区隐藏键盘方法
- 点击屏幕上EditText区域以外的任何地方隐藏键盘的解决方法
- iOS点击屏幕任意位置, 隐藏键盘(手势)
- iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法
- ios点击屏幕实现退出键盘的功能
- IOS实现点击软键盘的Next/Return按钮或者空白处后自动隐藏键盘
- iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法
- iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法
- ios-点击屏幕,隐藏键盘
- iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法
- oc,UITextFiled,怎么实现点击屏幕键盘自动隐藏和输入密码加密功能
- 【转】iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法
- iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘