UITextView vs UILabel 高度计算

UITextView vs UILabel height calculation

我有一个很大的文本文件要显示在屏幕上。例如:

Line 1
Line 2
Line 3
...
Line 138

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

[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];

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

UITextView 有填充,但 UILabel 没有。

您可以像这样在 iOS 7+:

上删除填充
textView.textContainer.lineFragmentPadding = 0;
textView.textContainerInset = UIEdgeInsetsZero;

请参阅 this question 了解 iOS 7.

之前的解决方案

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

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