textView的编辑页面控制键盘和textView

textView的编辑页面控制键盘和textView

这种编辑页面一般存在两个问题:

  1. textView的frame为页面的bounds,这样点击编辑的时候,如果输入的字数很多,键盘就会遮挡到文字,用户就看不到这在输入的文字了。
  2. 如果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];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值