美文网首页
iOS 键盘被遮挡的处理方案

iOS 键盘被遮挡的处理方案

作者: yyggzc521 | 来源:发表于2019-07-29 14:59 被阅读0次

    UIKeyboardTypeDecimalPad 价格键盘

    • 设置tableView滚动时键盘收起
    tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
    

    获取系统键盘的相关信息

        NSDictionary *userInfo = [notification userInfo];
        NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
        CGRect keyboardRect = [value CGRectValue];
       // 键盘的高度
        CGFloat keyBordH = keyboardRect.size.height;
       //键盘弹出需要的时间
        double duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
    • 监听键盘弹窗、隐藏的通知一个方法就可以搞定
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
    
    - (void)keyboardWillChangeFrame:(NSNotification *)note {
        // 取出键盘最终的frame
        CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
        //判断键盘升起还是落下
        CGFloat H = [UIScreen mainScreen].bounds.size.height - rect.origin.y;
        // 取出键盘弹出需要花费的时间
        double duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
        [self.tableView mas_updateConstraints:^(MASConstraintMaker *make) {
            if (H == 0) {  //键盘落下
                make.bottom.equalTo(self.view).offset(- 60 );
            } else { //升起
                make.bottom.equalTo(self.view).offset( - H);
            }
        }];
        //过渡动画
        [UIView animateWithDuration:duration animations:^{
            [self.view layoutIfNeeded];
        }];
    }
    

    任务评价输入框处理方案,之前开发项目键盘的处理一般都是用IQKeyboardManager第三方库处理的,方便快捷。但是顺丰的项目之前没有用这个库,所以不可能像之前小团队开发那样随便拿来就用了,只能自己处理键盘的遮挡和隐藏了

    要处理的界面1.png 要处理的界面2.png

    第一种方法:计算处理(比较容易出错,推荐使用第二种方法)

    - (void)keyboardWillShow:(NSNotification *)notification {
        //获取系统键盘的相关信息
        NSDictionary *userInfo = [notification userInfo];
        NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
        CGRect keyboardRect = [value CGRectValue];
        //获取键盘相对于self.view的frame ,传window和传nil是一样的
        keyboardRect = [self.view convertRect:keyboardRect fromView:self.view.window];
        CGFloat keyboardTop = keyboardRect.origin.y;
        CGFloat keyBordH = keyboardRect.size.height;
        //输入框所在的cell相对于self.view的frame
        CGRect rect = [self.inputCell.superview convertRect:self.inputCell.frame toView:self.view];
        CGFloat inputCellBottom = CGRectGetMaxY(rect);
        //输入cell被键盘遮挡
        if (keyboardTop < inputCellBottom) {
            //计算view偏移量
            CGFloat gap = keyboardTop - inputCellBottom;
            if (fabs(gap) > keyBordH) {
                //view的偏移量大于键盘高度
                self.view.transform = CGAffineTransformMakeTranslation(0, -keyBordH);
                [self.tableView setContentOffset:CGPointMake(0, (self.tableView.contentOffset.y + (fabs(gap) - keyBordH))) animated:NO];
            } else {
                //view的偏移量小于键盘高度
                self.view.transform = CGAffineTransformMakeTranslation(0, gap);
            }
        }
    }
    
    //当键退出
    - (void)keyboardWillHide:(NSNotification *)notification {
        //键盘退出 还原view的位置到原始位置
        self.view.transform = CGAffineTransformIdentity;
    }
    

    难点1 就是计算偏移量

    思路就是把输入框所在cell的frame和键盘view的frame都进行坐标转换,转换成针对self.view的坐标

    难点2 就是根据计算的偏移量改变view的frame

    1. 先判断输入框所在的cell是否被键盘遮挡,如果没有就不处理
    2. 如果遮挡了,但是偏移量小于键盘高度直接偏移self.view的frame即可
    3. 如果遮挡了,但是偏移量大于键盘高度,设置view的偏移量为键盘高度,同事设置tableview的contentOffset值即可

    第二种简单的处理方法,推荐使用这种

    晚上过代码时,登哥说你这样太麻烦了而且容易出错,有更简单的处理方法,就是利用系统的UITableViewController来进行处理。

    - (UITableView *)tableView {
        if (!_tableView) {
            UITableViewController *controller = [[UITableViewController alloc] init];
            controller.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
            _tableView = controller.tableView;
            _tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
            [self addChildViewController:controller];
            [controller didMoveToParentViewController:self];
        }
        return _tableView;
    }
    

    因为项目中的控制器都是继承的公共的基类控制器,所在这里不能继承UITableViewController,就用了上面的取巧的方法,然后试了一下果然奏效,登哥很给力!

    参考
    参考

    相关文章

      网友评论

          本文标题:iOS 键盘被遮挡的处理方案

          本文链接:https://www.haomeiwen.com/subject/wnjbrctx.html