我正在尝试构建与iMessage / WhatsApp类似的TextView,即一个TextView,其高度随着内容的增长而增加,但一旦达到一定高度也可以滚动。
我将textView设置为textContainerInsent为[8,0,8,0],高度为38,并且随着内容的增加,可以使用自动布局轻松调整TextView的大小。
当我尝试启用滚动时出现问题。每当我的textView有一行新的文本时,我的textContainerInsent就会感到困惑,并向上“推”我的文本(这意味着第一行文本在TextView的外面被切成一半)。出于某些甚至更奇怪的原因,这种情况仅每隔一行发生一次(因此在第二,第四,第六等)。
这也仅在新行的第一个字符处发生,并会迅速恢复到后续字符处(参见图片)。
通过将偶数行的top textContainerInsent强制为16([16,0,8,0]),而对于奇数行将其保持为[8,0,8,0],我可以将某些东西混在一起。 / p>
然而,这远非理想之举:
是什么原因造成的?我是否对textContainerInsents / TextView或ContentSize有误解?您对造成这种情况的根本原因的任何想法都将受到赞赏(并且不要过多地关注我的hack……无论如何我都希望摆脱它)。
我找到了以下有用的线程,但是我尝试了建议的答案,但它们对我不起作用(因为我不是在尝试删除所有填充并希望保持滚动状态):
How to lose margin/padding in UITextView?
// Called by textViewDidChange delegate
@objc func handleTextViewSearch() {
let maxTextViewHeight : CGFloat = 180
textView.isScrollEnabled = true
textView.showsVerticalScrollIndicator = true
textView.textContainerInset = UIEdgeInsetsMake(8, 0, 8, 0)
let sizeHeight = min(maxTextViewHeight, textView.contentSize.height )
// This is my textView Height Constraint
viewHeightConstraint.constant = sizeHeight
textView.contentOffset = CGPoint(x: 0, y: 0)
// This my hack to manually "push" my text back when it jumps by increasing my textContainerInsent to [16,0,8,0]... It almost fixes the issue but doesn't address the root cause for the weird TextView behavior...
if textView.contentSize.height > textView.frame.height && textView.contentSize.height <= (maxTextViewHeight - 10) {
// Weird micro readjustment: When line goes from 1 to 2, need to increase insent by another 8 points but only when going from odd to even lines (go figure)...
var insentAdjustment : CGFloat = 0
let linesNumber = numberOfLines(textView: textView)
if linesNumber % 2 == 0 {
print("Is even number")
insentAdjustment = 8
} else if linesNumber == 1 {
insentAdjustment = 8
}
textView.frame.size.height = textView.contentSize.height
textView.textContainerInset = UIEdgeInsetsMake(8 + insentAdjustment, 0, 8, 0)
print("Post update TextView: ", textView)
}
}