IOS動態獲取文本的高度--自適應文本寬度、高度Textview

[轉]IOS動態獲取文本的高度--自適應文本寬度、高度Textview

轉載整理. 轉載參考 見 博文底部

最新遇到一個問題,需要顯示一個可變長度的文本文字。

通常我們會先計算這部分文字需要顯示出來的高度值,然后把這個高度值設置成UITextView的高度值。這樣就做到了自動適配顯示。

  1. 之前我們是采用網上說的那種方式

<pre><code>

  • (float) heightForTextView: (UITextView *)textView WithText: (NSString *) strText{
    float fPadding = 16.0; // 8.0px x 2

    CGSize constraint = CGSizeMake(textView.contentSize.width - fPadding, CGFLOAT_MAX);

    CGSize size = [strText sizeWithFont: textView.font constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
    float fHeight = size.height + 16.0;
    return fHeight;
    }
    </code></pre>

可是 sizeWithFont 在7.0 被廢棄了 替代的方法是:<pre>CGSize size = [@"10" sizeWithAttributes: @{NSFontAttributeName: [UIFont fontWithName:self.myFont size:10]}];</pre>

結果發現在ios6上計算出的長度根本不對, 會致使有一部分文字顯示不出來的情況。但在ios7上上面這部分代碼是正確的。注:ios6, ios7對同樣的文字內容,即使使用的是相同的文字大小,計算出來的高度也是不一樣的。

注:今天發現, 上面這個方法在真機上是正常的,在XCode 5的模擬器上ios6上會有問題。 這應該是XCode 5的ios6模擬器的一個bug, 供各位參考

  1. 后來自己再嘗試了一番, 終于找到一個好的辦法來解決這個問題。(個人覺得下面這種方法比較贊,下面這種方法不需要考慮上面方法中的 UITextView的 8 padding問題,相對比較容易理解)

<pre><code>
+ (float) heightForString:(NSString *)value fontSize:(float)fontSize andWidth:(float)width
{
UITextView *detailTextView = [[UITextView alloc]initWithFrame:CGRectMake(0, 0, width, 0)];
detailTextView.font = [UIFont systemFontOfSize:fontSize];
detailTextView.text = value;
CGSize deSize = [detailTextView sizeThatFits:CGSizeMake(width,CGFLOAT_MAX)];
return deSize.height;
}
<code></pre>
自己測試使用過, ios6, ios7上均能計算出正常的值, 雖然同樣的內容,同樣的文字大小,計算出來的高度還是不一樣。

  1. 在網上查了一下, 有的說是用UILabel試一下, 配合CGSize size = [strText sizeWithFont: textView.font constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 這種方式也可以得正常的顯示值, (注意:在使用UILabel來時,計算文字高度時, 不需要像上面第一部分代碼中搞一個8 padding)

經驗證:

sizeWithFont這個方法貌似確實是針對UILabel的,如果用UILabel來顯示,其計算出來的高度和實際高度是吻合的。但是需要注意的是UILabel的文字內容和UILabel的寬度幾乎是重合的,這會讓人覺得文字太過于帖邊了,可以考慮設置其contentInset之類來處理,不過這個是另一個問題了。而UITextView則不會太帖邊,且行間距較大,適合顯示。 估計UILabel應該也可以設置其行間距和段間距的。

參考博文:

http://blog.csdn.net/smking/article/details/22221441

http://www.cocoachina.com/ask/questions/show/106701

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容