我們通常使用UILabel來展示文字硝逢,但當(dāng)文字中含有鏈接時(shí)的妖,再使用UILabel無法點(diǎn)擊文本中的鏈接矢洲。
所以璧眠,我們使用UITextView,該控件可識(shí)別并可點(diǎn)擊文本中的鏈接。
UITextView 高度自適應(yīng) 問題
在展示一段文字時(shí)蛆橡,我使用了
CGRect statusMattStrRect = [status.mAttStr boundingRectWithSize:contextSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
來計(jì)算出富文本的尺寸舌界,并賦給textView的frame:
self.textView.frame = baseStatusCellFrame.textFrame;
但問題出現(xiàn)了,發(fā)現(xiàn)textView的高度小于上面計(jì)算出來的文本高度泰演,文本顯示不全:
UITextView 高度自適應(yīng) 解決方案
上網(wǎng)查了很多資料呻拌,看了很多人寫的代碼,但要么是太復(fù)雜睦焕,要么是沒有效果藐握。
最后終于找到了最好最簡單的解決方案:
為textView設(shè)置以下兩個(gè)屬性(self表示繼承自UITextView的自定義textView控件):
self.textContainerInset = UIEdgeInsetsZero;
self.textContainer.lineFragmentPadding = 0;
效果如下:
解釋
UITextView中有一個(gè)textContainer,用來展示文本垃喊。
1猾普、系統(tǒng)會(huì)為其默認(rèn)設(shè)置距UITextView上、下邊緣各8的頁邊距:
使用以下代碼可以看到:
NSLog(@"textContainerInset: %@",NSStringFromUIEdgeInsets(self.textContainerInset));
2本谜、textContainer中的文段的上初家、下、左乌助、右又會(huì)被填充5的空白溜在。
使用以下代碼可以看到:
float lineFragmentPadding = [self.textContainer lineFragmentPadding]; NSLog(@"lineFragmentPadding: %f",lineFragmentPadding);
3、將文本的尺寸賦給UITextView的尺寸,UITextView的尺寸就是文本的尺寸了。而系統(tǒng)默認(rèn)的頁邊距和空白又占去了一部分尺寸会宪,那么真正展示文字的區(qū)域就減少了。所以志笼,我們看到UITextView中文字被展示的不全了。
為讓UITextView的尺寸完全就是文本的尺寸把篓,顯示完全文本纫溃,我們應(yīng)將UITextView頁邊距和空白去掉。