美文网首页经验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