UITextView与UILabel高度计算

时间:2015-04-05 17:22:20

标签: ios uiscrollview uilabel uitextview

我有一个大文本文件,我试图在屏幕上显示。例如:

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的Height Size是2139.539062。

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

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

提前致谢

更新:

以下是我用来完成这项工作的路线:

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

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

3 个答案:

答案 0 :(得分:2)

UITextView有填充,但UILabel没有填充。

您可以在iOS 7 +上删除这样的填充:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以尝试将lblResults.textContainer.maximumNumberOfLines设置为大号。 (iOS 7)