iOS 计算UILabel 文本高度问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 计算UILabel 文本高度问题相关的知识,希望对你有一定的参考价值。

参考技术A

首先看下图:

这是一个非常简单的cell。 但是这个cell高度是多少,你怎么说??

1.直接写死高度就好了啊,不用计算了。方便省事。
2.根据文本计算cell高度。
3.用第三方库,使用自动布局方法,撑满cell,自动有高度,不用计算。

1.cell高度不能写死,需求说要根据文本内容灵活自适应高度。
3.这个利用自动布局,这里不多说了。

2.利用文本计算出每个Label的高度,从而确定cell高度。
这里有一个问题, 你究竟采用什么方法计算文本高度呢?

这里不是特别准确,最好加一个offset值最好。
但是: 这也不符合需求定位。 需求是文本最多显示两行,多余两个就...省略。
那这里就有问题了: 当文本刚好1行或是2行的这是没有问题的,但是当文本多余两行的话,就不行了,明显高了。

但是: 这样计算也有问题,这个属性只能计算一行文本的高度。 (这种说法其实是不正确的,intrinsicContentSize可以计算出ULabel的高度,但是要向下面说的需要多设置 preferredMaxLayoutWidth 属性。)
这时候你又说了,那我这样计算:

但是: 这样你在初始化UILabel的时候,就已经确定了 numberOfLines = 2 的值,当文本只有一行的时候,就多计算了一行。也不行。

这样子确实可以,不过有些麻烦哈。

还是使用 intrinsicContentSize 方法。 不过要在初识化UILabel的时候多设置一个属性 preferredMaxLayoutWidth 。
看官方解释:

初始化UILabel的时候设置这个属性的值为UILabel的宽度即可,然后通过 intrinsicContentSize 方法就可以准确计算出文本的高度了。

使用 sizeThatFits: 方法计算,不用额外设置上面那些不用的属性。
直接掉用下面方法即可。

UITextView vs UILabel 高度计算

【中文标题】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 行。底部仍然被切断。

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

自动增加/减少 UITableViewCell 中的 UILabelView 高度?

iOS--UILabel设置行距和字间距,并根据文本计算高度

iOS-UILabel根据文本字体大小计算label宽度;以及自适应高度

文本为空字符串时,自动布局UILabel的动态高度计算不起作用?

当我在 ios 中展开和折叠 TableList 单元格时如何更改 UILabel 文本颜色

自动布局 4 个 UILabel,根据其内容/文本垂直高度