iOS开发 如何优雅的处理键盘遮挡问题

在项目开发中,经常遇到键盘遮挡问题,那我们应该怎么去处理呢?


iOS开发 如何优雅的处理键盘遮挡问题_第1张图片
屏幕快照 2017-06-18 21.17.17.png

上面是我项目中的一个页面,其中tableView上有多个textFiled,多次点击新建商品规格,tableView会出现多个价格,库存,每日库存多个section。那么对于这样的页面我们应该怎么处理呢?


iOS开发 如何优雅的处理键盘遮挡问题_第2张图片
屏幕快照 2017-06-18 21.22.27.png

下面就具体介绍如何处理这样的问题。
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方法中移除观察者。

你可能感兴趣的:(iOS开发 如何优雅的处理键盘遮挡问题)