iOS:解决UITextView自适应高度粘贴大量文字导致上移显示不全的问题

时间:2024-05-19 09:06:38

背景:

UITextView文本输入框随文字多少自适应高度。
发现一个比较坑的问题, 在空的时候复制粘贴(PS:粘贴一段很长的文案,已经超出设置的UITextView最大高度,比如设置UITextView的最大高度130) 更新约束高度后,高度是正确的,但是文字显示不正常,出现上移的现象。如下现象

iOS:解决UITextView自适应高度粘贴大量文字导致上移显示不全的问题

猜想:

是由于粘贴文案过长,UITextView内容自适应高度计算出现误差,导致UITextView滚动出现异常,导致整块文字上移消失。

 

解决:

在UITextView的代理方法中textViewDidChange设置如下:

 

- (void)textViewDidChange:(UITextView *)textView

{

    //定义最大高度

    static CGFloat maxHeight = 130.0f;

    CGRect frame = textView.frame;

    CGSize constraintSize = CGSizeMake(frame.size.width, MAXFLOAT);

    CGSize size = [textView sizeThatFits:constraintSize];    

    if (size.height < 42) {

        size.height = 42;

    }

    if (size.height >= maxHeight) {

        size.height = maxHeight;

    }

    

    //解决UITextView 复制粘贴内容 出现文字上移显示不全的问题(当输入超过一行 此时再复制粘贴很长一段文案PS复制我文案超过设置的最大高度,不延迟调用的话就会出现文字上移问题)

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.02 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        if (size.height >= maxHeight) {

            textView.scrollEnabled = YES;   // 允许滚动

            [textView scrollRangeToVisible:textView.selectedRange];

        }else {

            textView.scrollEnabled = NO;    // 不允许滚动,当textview的大小足以容纳它的text的时候,需要设置scrollEnabed为NO,否则会出现光标乱滚动的情况

        }

    });

    

    [UIView animateWithDuration:0.3 animations:^ {

        self.view.frame = CGRectMake(0, StatusBarAndNavHeight-keyboardSize.height-((size.height + 58) - 100), self.view.width, self.view.height);

        CGFloat writeViewY = SCREEN_H - keyboardSize.height - (size.height + 58);

        CGRect frame = self.writeView.frame;

        frame.origin.y = writeViewY;

        frame.size.height = size.height + 58;

        self.writeView.frame = frame;

    }];

}

 

尤其注意上述方法中dispatch_after中的延迟参数0.02的设置,注意不能设置为0,否则会失效