在项目开发中,经常遇到键盘遮挡问题,那我们应该怎么去处理呢?
上面是我项目中的一个页面,其中tableView上有多个textFiled,多次点击新建商品规格,tableView会出现多个价格,库存,每日库存多个section。那么对于这样的页面我们应该怎么处理呢?
下面就具体介绍如何处理这样的问题。
1.设置tableView的键盘退出模式:
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
2.监听键盘弹出事件
//监听键盘弹出事件
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardWillShowWithNotification:) name:UIKeyboardWillShowNotification object:nil];
其中keyBoardWillShowWithNotification将在后面具体介绍。
3.第三步是关键一步,将tableView的每个textFiled的代理设成self.在代理方法中做如下处理:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
self.activedTextFieldRect = [textField convertRect:textField.frame toView:self.tableView];
}
其中activedTextFiledRect为当前正在编辑的textField的frame相对于tableView的位置。
4.在keyBoardWillShowWithNotification处理键盘弹出事件
- (void)keyBoardWillShowWithNotification:(NSNotification *)notification {
//取出键盘最终的frame
CGRect rect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
//取出键盘弹出需要花费的时间
double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
//获取最佳位置距离屏幕上方的距离
if ((self.activedTextFieldRect.origin.y + self.activedTextFieldRect.size.height) > ([UIScreen mainScreen].bounds.size.height - rect.size.height)) {//键盘的高度 高于textView的高度 需要滚动
[UIView animateWithDuration:duration animations:^{
self.tableView.contentOffset = CGPointMake(0, 64 + self.activedTextFieldRect.origin.y + self.activedTextFieldRect.size.height - ([UIScreen mainScreen].bounds.size.height - rect.size.height));
}];
}
通过self.activedTextFieldRect.origin.y + self.activedTextFieldRect.size.height) 与 ([UIScreen mainScreen].bounds.size.height - rect.size.height)的比值就可以判断当前处于编辑状态的textField是否被键盘遮挡。其中64是自己根据UI,调整的一个适当值,可根据视觉做适当调整。
最后记得在dealloc方法中移除观察者。