在开发中通常会遇到一些需要输入信息相关的需求,那么就会调用到键盘来录入信息,但录入完毕键盘控件的回收问题从而随之而来;
通过巧妙的回收键盘控件可以大大的提高用户的体验效果,主要都是围绕 touch 事件和一些控件的代理监听方法展开实现操作;
接下来我们可以通过如下几种事件方式根据当前需求进行使用.
一.提到录入信息,通常优先会想到 UITextView 和 UITextField
使用如上两种控件录入是日常中最为常见的,那么将控件设置好自己相关的代理后,便可以实现对键盘的相关监听处理操作;
首先需要将控件进行实例化,其次通过调用它们各自的代理方法来执行对键盘的具体处理操作.
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if ([text isEqualToString:@"\n"]) {
[textViewUser resignFirstResponder];
return NO;
}
return YES;
}
注:首先需要在 interface 中引用对应控件的代理(例如:UITextFieldDelegate, UITextViewDelegate),并将代理指向至当前控件.
二.点击录入区域外的区域_1
当调用控件录入信息完毕后,点击录入和键盘之外任意区域即可将键盘收起,使得很自然的提升用户体验效果;
可以通过 Touch 事件来实现该原理,具体实现 code 如下:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if (![textViewPwd isExclusiveTouch]) {
[textViewPwd resignFirstResponder];
}
}
三.点击录入区域外的区域_2
该方法与上面第二项中的类似,但区别在于事件触发原理不同;
上者为通过 Touch 事件响应的原理;
则该方法中介绍的则是通过 UIController 的 Touch Up Inside 绑定点击事件来进行实现收起的效果;
具体代码实现如下:
- (IBAction)dismissKeyboard:(id)sender {
[textViewPhone resignFirstResponder];
}
注:该项中和第二项中所要执行的操作都要确保为当前图层中,即 UIController 或 UIView.
四.自定义按钮事件
当外界没有可供借用的资源时,可以考虑通过自定义按钮并绑定其事件从而达到收起键盘的操作;
其中需要利用通知来辅助完成,具体操作如下:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doneButtonshow:)
name:UIKeyboardDidShowNotification
object:nil];//注册通知,进行监听当前状态
}
#pragma mark - 具体响应事件相关
- (void)hideBtnshow:(NSNotification *)notification {
hideBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
hideBtn.frame = CGRectMake(20, 80, 60, 44);
[hideBtn setTitle:@"完成" forState:UIControlStateNormal];
[hideBtn addTarget:self
action:@selector(hideKeyboard)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:hideBtn];
}
- (void)hideKeyboard {// 按钮事件所需执行的操作
[hideBtn removeFromSuperview];
[textViewPwd resignFirstResponder];
}
- (void)dealloc {//移除当前通知
[[NSNotificationCenter defaultCenter] removeObserver:self];
}