美文网首页经验demoiOS即时通讯iOS 开发~项目常用,经典内容收集
【Objective-c】 键盘遮挡看我的就行了(特别是UIT

【Objective-c】 键盘遮挡看我的就行了(特别是UIT

作者: MR_詹 | 来源:发表于2016-12-06 16:14 被阅读1724次

上一编iOS_键盘遮挡问题解决文章中做了简单的键盘遮挡问题的处理,但在实际使用中往往是不够的,并且在复杂的界面中还会出现许多奇怪的BUG,所以小编继续探究,决定还是使用第三方框架比较快捷并安全,但是也是有一些需求满足不了的,比如textView控件中虽然会往上移动避免遮挡问题,但是如果textView的控件的尺寸比较大的时候,还是会出现遮挡的问题。(小编用了整整一天的时间才稍微解决了这个问题,不得不说,效率实在是太低了)

以下是小编在解决问题时,一些比较好的文章提供的思路:
1、FuckerQ:点击键盘以外的地方,收键盘
2、黑白灰的绿i:textView的自适应高度、textView的遮挡问题

进入正题:

还是先看效果图

textView.gif

(前提是UITextView的大小是固定的,使用第三方库IQKeyboardManager解决遮挡)
整体思路:
1、第三方框架的因为,textView整体已经往上移动,为了避免继续移动而给复位带来BUG,和更好的用户体验,所以决定通过改变textView内边距的方式解决内容遮挡问题
2、判断textView在输入状态上移后,textView的尺寸是否还会被键盘遮挡(是)
3、通过获取textView输入光标的位置,判断输入的位置是否被键盘遮挡
4、将键盘的坐标和textView输入光标的坐标都转换到同一个坐标系中,进行比较算出需要移动的距离


注册通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHidden:) name:UIKeyboardDidHideNotification object:nil];
//键盘出现
- (void)keyboardDidShow:(NSNotification *)notification{
    //获取键盘高度
    NSDictionary *dict = notification.userInfo;
    _kbRect = [[dict objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    [self autoAdjustTo:_textView];
}
//键盘消失
- (void)keyboardDidHidden:(NSNotification *)notification{
    _textView.textContainerInset = UIEdgeInsetsMake(5, 5, 5, 5);
}

监听textView的输入

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    [self autoAdjustTo:textView];
    return YES;
}

核心代码

- (void)autoAdjustTo:(UITextView *)textView{
    //1.计算键盘的位置 Y 坐标
    CGFloat kbY = CGRectGetMinY(_kbRect);
    //2.计算textView的 MAXY 和 MINY
    CGRect textRect = [textView convertRect:textView.frame toView:[UIApplication sharedApplication].keyWindow];
    CGFloat MAXY = CGRectGetMaxY(textRect);
    CGFloat MINY = CGRectGetMinY(textRect);
    //3.计算textView 内容的高度
    CGSize size = [textView sizeThatFits:CGSizeMake(CGRectGetWidth(_textView.frame), MAXFLOAT)];
    //4.获取光标的位置
    CGPoint cursorPosition = [textView caretRectForPosition:textView.selectedTextRange.end].origin;
    CGPoint point = [textView convertPoint:cursorPosition toView:[UIApplication sharedApplication].keyWindow];

    NSLog(@"+++++++++++++++++光标坐标:%f   键盘坐标:%f++++++++++++++",point.y+15,kbY);
    
    //5.判断
    //当textView 的frame比较大,上移后还会被键盘遮挡的话
    if (MAXY > kbY) {
        //当输入光标在键盘下方,15是字体的大小
        if (point.y+15>kbY) {
            //计算textView上内边距需要移动的高度
            [UIView animateWithDuration:0.3 animations:^{
                CGFloat move = point.y + 15 - kbY - textView.textContainerInset.top;
                NSLog(@"=======================%f==============================",move);
                NSLog(@"---------------%f-----------------",textView.textContainerInset.top);
                //这里move-10是为了光标与键盘边界有点距离,更美观
                textView.textContainerInset = UIEdgeInsetsMake(-move-10-5, 5, 5, 5);
            }];
        }
    }
}

键盘的遮挡,小编还是极力推荐使用IQKeyboardManager开源库,毕竟这不是App的主要功能所在,不必损耗太多的时间在这上面。
标题党[机智],值得吗?
完整Demo

相关文章

网友评论

  • 9d426ee34834:你好 我出现了 一个类似于键盘 遮挡 视图的问题! 主要是由于键盘顶部的那一排文字视图,在继续frme 的时候 有时候把它的frme 加入到 键盘高度中去 有时又没有加入到键盘的高度中去 导致偶尔会产生 遮挡问题 !
  • e4d93d6aae84:是的,IQKeyboardManager很方便,把键盘上的导航条去掉,就当做没这个东西一样,就是多了这个功能
  • 就让我安安静静的做一个美女子:加油加油
    MR_詹:@就让我安安静静的做一个美女子 :stuck_out_tongue_winking_eye: 谢谢

本文标题: 【Objective-c】 键盘遮挡看我的就行了(特别是UIT

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