背景:
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,否则会失效