UITextView vs UILabel 高度计算

Posted

技术标签:

【中文标题】UITextView vs UILabel 高度计算【英文标题】:UITextView vs UILabel height calculation 【发布时间】:2015-04-05 17:22:20 【问题描述】:

我想在屏幕上显示一个大文本文件。例如:

Line 1
Line 2
Line 3
...
Line 138

我有一个 UIScrollview,并动态添加带有文本的 UILabel 或 UITextView 的子视图。我可以用这个来计算文本的宽度/高度:

[passedTextInFile boundingRectWithSize:CGSizeMake(20000.0f, 20000.0f) options:NSStringDrawingUsesLineFragmentOrigin attributes:@NSFontAttributeName: [UIFont fontWithName:@"Times New Roman" size:textSize] context:Nil].size;

然后我创建我的 UILabel 并像这样添加到子视图中:

CGRect test = CGRectMake(5.0, 5.0, maxWidthSize, maxHeightSize);
CGSize maxSize = CGSizeMake(maxWidthSize, maxHeightSize);
UILabel *lblResults = [[UILabel alloc] initWithFrame:test];
[lblResults setFrame:test];
[lblResults setText:passedTextInFile];
[lblResults setFont:[UIFont fontWithName:@"Times New Roman" size:textSize]];
[lblResults setTextColor:[UIColor blackColor]];
[lblResults setNumberOfLines:0];

[svResults addSubview:lblResults];
[svResults setShowsHorizontalScrollIndicator:true];
[svResults setScrollEnabled:true];
[svResults setContentSize:maxSize];

上面的代码效果很好。我可以看到第 1 行,然后滚动到底部并看到第 138 行。

但是,当我将 UILabel 更改为 UITextView 时,我只能滚动到第 131 行。

UITextView *lblResults = [[UITextView alloc] initWithFrame:test];
[lblResults setFrame:test];
[lblResults setText:passedTextInFile];
[lblResults setFont:[UIFont fontWithName:@"Times New Roman" size:textSize]];
[lblResults setTextColor:[UIColor blackColor]];
[lblResults setScrollEnabled:false];
[lblResults setEditable:false];

它似乎在最后切断了一些文本。我已经仔细检查了 UILabel 和 UITextView 的高度大小都是 2139.539062。

现在,当我为 UITextView 启用滚动时,我可以滚动到第 131 行,让滚动停止,然后可以滚动到第 138 行。换句话说,我在 UIScrollView 中滚动到第 131 行,然后到 UITextView 中的第 138 行。我不想要这种行为,这就是我禁用 UITextView 滚动的原因。

我的问题是,与 UILabel 相比,为什么 UITextView 中的滚动会提前停止。我可以更改 UITextView 中的设置以使其像 UILabel 一样显示吗?

提前致谢

更新:

这是我用来完成这项工作的行:

[[lblResults textContainer] setLineFragmentPadding:0.0];
[lblResults setTextContainerInset:UIEdgeInsetsZero];
[lblResults sizeToFit];

再次感谢大家的快速回复和帮助。

【问题讨论】:

【参考方案1】:

UITextView 有填充,但 UILabel 没有。

您可以在 ios 7+ 上像这样删除填充:

textView.textContainer.lineFragmentPadding = 0;
textView.textContainerInset = UIEdgeInsetsZero;

有关 iOS 7 之前的解决方案,请参阅 this question。

【讨论】:

感谢亚伦的快速回复。我尝试了您发布的解决方案。我现在最多可以查看第 132 行,但不幸的是我仍然缺少 6 行 =(【参考方案2】:

UIlabel 是一个视图 UITextView 也是一个视图,boundingRectWithSize 方法与视图框架不同,它只是包含该文本的边界矩形。正如 Aaron 所建议的,UITextView 包含填充,而 UILabel 不包含。设置字符串后,在文本容器上知道确切的框架调用-sizeToFit,然后再请求它的框架。

【讨论】:

安德烈亚,非常感谢。一个非常简单的答案。我制作了我的文本视图“sizeToFit”,将其用作滚动视图的框架,一切都很好。 +1【参考方案3】:

您可以尝试将lblResults.textContainer.maximumNumberOfLines 设置为一个很大的数字。 (iOS 7)

【讨论】:

感谢奥斯汀的快速回复。我尝试了您的解决方案,但不幸的是我仍然只能滚动到第 131 行。底部仍然被切断。

以上是关于UITextView vs UILabel 高度计算的主要内容,如果未能解决你的问题,请参考以下文章

UITextView 布局的正确高度

是否可以制作一个 UILabel、UITextView 或类似的东西,它总是在不截断的情况下调整其高度以适应其在 Interface Builder 中的内容?

UITextView高度调整

UITextView 高度未在 UITableViewCell 中调整大小

在 iOS 7 下,如何使我的 UITextView 高度取决于运行应用程序的设备类型(4 英寸屏幕 vs 3.5)

如何使用 UILabel 支持自动调整 UITableViewCell 的大小