我正在尝试使用以下代码动态更新UITextView的高度,但结果始终被几个像素关闭,导致文本视图换行但不适当地调整大小。输入另一个字符(或两个)后,显示屏会相应更新。
我查看了各种帖子(很多帖子已经过时了,因为它们引用了弃用的sizeThatFits),我看不出有什么不同。那些使用boundingRectWithSize :( NSString或NSAttributedString - 我已经尝试过两者)看起来如下:
CGRect boundingRect = [string boundingRectWithSize: CGSizeMake(CGRectGetWidth(textView.frame), CGFLOAT_MAX)
options: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes: @{
NSFontAttributeName : textView.font
}
context: NULL];
float h = ceil(CGRectGetHeight(boundingRect));
textViewHeightLayoutConstraint.constant = h;
我知道你要说的第一件事是:插图。这是我的设置代码:
textView.textContainerInset = UIEdgeInsetsZero;
textView.contentInset = UIEdgeInsetsZero;
textView.layoutMargins = UIEdgeInsetsZero;
是否有另一个insets设置?
旁注:我正在使用MuseoSans作为字体。
黑客解决方案
我通过检查宽度是否在阈值范围内(目前是测试的9px)来“解决”问题,如果是,假装添加了额外的行,如下所示:
float fontHeight = ceil([@"lp" sizeWithAttributes: @{
NSFontAttributeName : textView.font
}].height);
if ((CGRectGetWidth(textView.frame) - ceil(CGRectGetWidth(boundingRect))) <= 9.f)
h += fontHeight;
上面允许我捕捉最大可能的高度,然后在我的文本视图上强制它的高度。文本视图确实适当地换行并在下一行显示文本。
想法?
小更新
添加此项无效:
NSMutableParagraphStyle *paragraphStyle = [NSParagraphStyle.defaultParagraphStyle mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
CGRect boundingRect = [string boundingRectWithSize: CGSizeMake(CGRectGetWidth(textView.frame), CGFLOAT_MAX)
options: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes: @{
NSFontAttributeName : textView.font,
NSParagraphStyleAttributeName : paragraphStyle
}
context: NULL];
答案 0 :(得分:8)
我找到了答案。它在:
textView.textContainer.lineFragmentPadding
我需要从textView宽度中减去它。我想除了3组插图和边距之外还有另一个填充来源。