文本框注销第一响应者,对应的响应时间就是系统收回键盘,并且在隐藏键盘时会发出 UIKeyboardWillHideNotification和UIKeyboardDidHideNotification的通知
最后,系统调用 textFieldDidEndEditing: 方法结束输入,并发出UITextFieldTextDidEndEditingNotification的通知。
二 键盘的弹出与收起
2.1 弹出键盘的控制
关于键盘的弹出与收起问题,从上面的响应过程分析可知,键盘的弹出对于UITextField和UITextView都是自动弹出的,所以我们无需进行控制。如果需要进行控制,我们知道其实在弹出之前是调用了UITextFieldDelegate或UITextViewDelegate的以下方法来控制是否使当前文本框设置为第一响应者( becoming the first responder),文本框成为第一响应者的结果就是可以输入文本内容并弹出键盘,所以,我们可以在这个方法中通过返回值来判断是否弹出键盘。
//UITextField调用此方法
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
//返回YES是弹出键盘 返回NO则不弹出键盘
}
//UITextView调用此方法
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView{
//返回YES是弹出键盘 返回NO则不弹出键盘
}
2.1 收起键盘的控制
通过前面的分析我们知道,收起键盘主要是要注销文本框的第一响应者身份即可,所以,我们再需要控制键盘收起的时候调用 textFieldShouldEndEditing: 方法即可达到目的。关于收起键盘,我们通常有两种做法如下:
一是通过我们的键盘上的【return/完成】按键的点击事件来设置
二是设置点击空白处就收起键盘,这种方法现在比较普遍
这两种做法在UITextField和UITextView上的实现在我之前的随笔中有专门讲到过了,想了解的小伙伴可以直接戳这里:ios学习——键盘的收起
三 文本框内容的获取
在之前的分析中,我们知道,文本框在结束之后都会调用一个方法就是 textFieldDidEndEditing: / textViewDidEndEditing: 方法,这个方法就是方便我们在输入结束之后对文本框内容进行处理。如果我们开发过程中一个页面有多个相同类型的输入文本框,我们可以通过设置不同的tag来区分当前的是哪一个输入文本框,从而进行不同的处理,具体示例如下:
- (void)textViewDidEndEditing:(YYTextView *)textView{
if (textView.tag == 400) {
NSString *reason = textView.text;
[self.submitInfoDic setObject:reason forKey:@"reason"];
} else {
NSString *remark = textView.text;
[self.submitInfoDic setObject:remark forKey:@"remark"];
}
}
四 键盘弹出的遮挡问题
还是在之前的分析中,我们知道在键盘弹出和收起时,系统都会发出对应的通知,所以我们可以在收到键盘弹出的时候判断键盘的位置和当前输入文本框的位置,如果有遮挡,就将当前视图进行一个向上平移,在收到键盘回收的通知时就平移到原先的位置。所以,主要分为2步:










