很多的時候如果隻是要顯示一些簡單的短文本,比如确定、取消什麼的,一個uilabel就足夠了。
但是某些情況下,文本較長。包含這些文本的view的高度取決于文本的高度。比如我們常見的
微網誌。雖然文本所占的高度内容限制在了140字,但是使用者發的微網誌是140字内的多少字,
我們不清楚。那麼在用到uitableview的時候,每條微網誌所在的cell的高度都要根據其中包含的
文字及其他内容所需要的實際高度來進行設定。當然,此文隻讨論文本的高度計算問題,而且
難度也隻集中在文本的動态高度上。
長文本高度的計算沒有友善的方法,雖然簡單。在計算前必須要給出長文本所在view的寬度
和一個無限高度,然後計算長文本實際使用的高度。由以上條件可以得出一個計算公式:
實際高度 = f(text, view.width, 9999);
但是還有一個因素不能忘記:字型(font )。用9999代表無限高度這個不用解釋了吧:
目前來說iphone的顯示高度還沒有9999這麼多。 但是這裡的無限高度可以看做是一個常數。是以
從參數中去掉。最後的公式是:
實際高度 = f(text, font, view.width);
很幸運,上面公式裡的f,也就是映射關系非常簡單。從下面的一個例子可見端倪。

1 - (cgfloat) calculatetextheight:(uifont *)font giventext:(nsstring *)text givenwidth:(nsuinteger)width{
2
3 cgsize size = [text sizewithfont:font constrainedtosize:cgsizemake(width, 9999)
4 linebreakmode:uilinebreakmodewordwrap];
5 cgfloat delta = size.height;
6
7 return delta;
8 }

最後你可以用計算出來的不同長度文本的高度來設定包含這段文本的view的高度。如下所示:

1 - (void) resizelabel:(uilabel *)thelabel shrinkviewiflabelshrinks:(bool)canshrink {
2 cgrect frame = [thelabel frame];
3 cgsize size = [self calculatetextheight:thelabel.font giventext:thelabel.text givenwidth:frame.size.width];
4
5 cgfloat delta = size.height - frame.size.height;
6 frame.size.height = size.height;
7 [thelabel setframe:frame];
8
9 cgrect contentframe = self.frame;
10 contentframe.size.height = contentframe.size.height + delta;
11 if(canshrink || delta > 0) {
12 [self setframe:contentframe];
13 }

全文完。如果對你有幫助,請點推薦。謝謝!
歡迎加群互相學習,共同進步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,轉載請注明出處!http://www.cnblogs.com/sunshine-anycall/archive/2012/07/31/2617385.html