我们通常使用UILabel来展示文字,但当文字中含有链接时,再使用UILabel无法点击文本中的链接。
所以,我们使用UITextView,该控件可识别并可点击文本中的链接。
UITextView 高度自适应 问题
在展示一段文字时,我使用了
CGRect statusMattStrRect = [status.mAttStr boundingRectWithSize:contextSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
来计算出富文本的尺寸,并赋给textView的frame:
self.textView.frame = baseStatusCellFrame.textFrame;
但问题出现了,发现textView的高度小于上面计算出来的文本高度,文本显示不全:
UITextView 高度自适应 解决方案
上网查了很多资料,看了很多人写的代码,但要么是太复杂,要么是没有效果。
最后终于找到了最好最简单的解决方案:
为textView设置以下两个属性(self表示继承自UITextView的自定义textView控件):
self.textContainerInset = UIEdgeInsetsZero;
self.textContainer.lineFragmentPadding = 0;
效果如下:
解释
UITextView中有一个textContainer,用来展示文本。
1、系统会为其默认设置距UITextView上、下边缘各8的页边距:
使用以下代码可以看到:
NSLog(@"textContainerInset: %@",NSStringFromUIEdgeInsets(self.textContainerInset));
2、textContainer中的文段的上、下、左、右又会被填充5的空白。
使用以下代码可以看到:
float lineFragmentPadding = [self.textContainer lineFragmentPadding]; NSLog(@"lineFragmentPadding: %f",lineFragmentPadding);
3、将文本的尺寸赋给UITextView的尺寸,UITextView的尺寸就是文本的尺寸了。而系统默认的页边距和空白又占去了一部分尺寸,那么真正展示文字的区域就减少了。所以,我们看到UITextView中文字被展示的不全了。
为让UITextView的尺寸完全就是文本的尺寸,显示完全文本,我们应将UITextView页边距和空白去掉。