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

背景:

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

猜想:

是由于粘贴文案过长,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,否则会失效

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值