textView的编辑页面控制键盘和textView
这种编辑页面一般存在两个问题:
- textView的frame为页面的bounds,这样点击编辑的时候,如果输入的字数很多,键盘就会遮挡到文字,用户就看不到这在输入的文字了。
- 如果textView上有很多文字,点击某一行,键盘弹出,键盘也会遮挡到文字,如何让页面恰好移动到键盘的上面。
解决思路:
点击textView,键盘弹出时,改变textView的高度。
键盘弹出,textView高度变为view的height-键盘的height;
键盘消失,textView的高度为view的height。
代码如下:
- (void)keyboardChangeFrame:(NSNotification *)note
{
CGRect keyboardFrame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
[UIView animateWithDuration:0.25 animations:^{
if (keyboardFrame.origin.y == MainScreenHeight) {
[self.textView mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(self.view);
}];
} else {
[self.textView mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(self.view).offset(-keyboardFrame.size.height);
}];
}
}];
}
针对问题2,textView的高度改变了,textView内部会自动处理将光标的位置恰好移动在键盘的上面,亲测有效。
还有一种思路是:
监听textView上光标的位置,在计算光标位置前面文字的高度,再将textView向上移动,textView继承于scrollView,可以使用setContentOffset:animated:
方法。这种方案并不能很好的解决光标的位置恰好在键盘上面,至少一开始点击的时候是不能的,因为它要先监听到问题的输入,如果没有输入,就不会有移动。
- (void)textViewDidChange:(UITextView *)textView
{
// 光标所在的位置
NSRange range = textView.selectedRange;
// 获取光标前的文字
NSString *text = [textView.text substringWithRange:NSMakeRange(0, range.location)];
// 计算获取文字的高度
CGFloat textH = [text textRectWithFont:[UIFont systemFontOfSize:15] maxSize:CGSizeMake(self.textView.width - 20, MAXFLOAT) mode:(NSLineBreakByCharWrapping)].height;
// 计算移动的距离
CGFloat offSetY = textH - self.keyboardFrame.origin.y;
// 移动
if (offSetY > 0) {
[self.textView setContentOffset:CGPointMake(0, offSetY) animated:YES];
} else {
[self.textView setContentOffset:CGPointMake(0, 0) animated:YES];
}
}