上一编iOS_键盘遮挡问题解决文章中做了简单的键盘遮挡问题的处理,但在实际使用中往往是不够的,并且在复杂的界面中还会出现许多奇怪的BUG,所以小编继续探究,决定还是使用第三方框架比较快捷并安全,但是也是有一些需求满足不了的,比如textView控件中虽然会往上移动避免遮挡问题,但是如果textView的控件的尺寸比较大的时候,还是会出现遮挡的问题。(小编用了整整一天的时间才稍微解决了这个问题,不得不说,效率实在是太低了)
以下是小编在解决问题时,一些比较好的文章提供的思路:
1、FuckerQ:点击键盘以外的地方,收键盘
2、黑白灰的绿i:textView的自适应高度、textView的遮挡问题
进入正题:
还是先看效果图

(前提是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
网友评论