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

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

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

进入正题:

还是先看效果图

【Objective-c】 键盘遮挡看我的就行了(特别是UITextView)_第1张图片
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

你可能感兴趣的:(【Objective-c】 键盘遮挡看我的就行了(特别是UITextView))