iOS 键盘被遮挡的处理方案

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,就用了上面的取巧的方法,然后试了一下果然奏效,登哥很给力!

参考
参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,172评论 1 32
  • 2017.02.22 可以练习,每当这个时候,脑袋就犯困,我这脑袋真是神奇呀,一说让你做事情,你就犯困,你可不要太...
    Carden阅读 1,407评论 0 1
  • 一.UITextField属性 0.enablesReturnKeyAutomatically 默认为No,如果设...
    奋斗ing0310阅读 1,703评论 0 2
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,586评论 1 14
  • 今天,不昨天就通知了“天鸽”台风要正面登陆珠海,大家伙和平时一样做好准备,但是心里都觉得“估计又要被台风放鸽子”。...
    朵朵颐阅读 321评论 0 2