前言
?對于每個iOS程序猿來說,UITableView基本上是項目中必須會用到的控件,對于那些不等高的cell,有時候確實是比較的頭疼。本人接觸iOS算是比較的晚,前年才開始了自己的iOS開發(fā),對于cell的高度計算有了些自己的心得,拿出來分享下。一是為了鍛煉下自己的寫作能力以及總結(jié)問題的能力,二是也算為自己做個筆記,另外更加的希望能夠幫助到更多地人。
曾經(jīng)
對于cell的計算高度,一般都是涉及到UILabel的文本內(nèi)容不確定,需要根據(jù)文本的內(nèi)容獲取到cell得顯示高度。
在iOS 6之前或者你的應(yīng)用需要支持的版本最低到了iOS6及以前,一般都是采用面向?qū)ο蟮姆椒?,來獲取文本的高度從而確定cell的最終的展示高度。
我們來看看iOS6及以前計算文本高度的方法:
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:")
這是計算的文本高度的方法,一般需要知道字體大小,預(yù)估的寬度和高度(一般計算高度寬度必須是個固定的值)默認的換行模式是NSLineBreakModeWordWrap。還有一個可以自己定義換行模式的方法,有興趣的可以自己去看下。
再來看看iOS7的做法,因為真正開發(fā)企業(yè)級應(yīng)用是在iOS為主的平臺上,所以當(dāng)時也用的比較的多。
有兩種情況,第一種可以使用iOS7NSString新的計算文本高度的方法。
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary*)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
這里需要設(shè)置一些參數(shù),size跟iOS6一樣;options表示計算的方式一般使用NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin;attributes為文本的一些屬性,可以設(shè)置自己大小,行距等一些屬性,根據(jù)自己的需求來。context一般設(shè)置為nil。
另外一種方法就是使用NSAttributedString的方法來計算,其實跟上面的做法差不多,只是你提前給NSAttributedString設(shè)置了一些屬性,方法看上去也一樣。
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 6_0);
size、options和context和上面的設(shè)置都是一樣,只是NSAttributedString中就已經(jīng)帶有文本的各種屬性了。
今生
隨著iPhone6和iPhone6 plus的問世,自動布局開始慢慢地使用起來,也越來越有必要。其中一種新的界面布局方式也隨之開始流行,那就是autoLayout。這樣也就開始出現(xiàn)了一種新的解決方案。
首先使用autolayout,將UIlabel的上下左右的布局都固定好,設(shè)置為多行。

第二步:在cell的awakeFromNib方法中設(shè)置lbl的一些屬性
self.lblContent.preferredMaxLayoutWidth = [[UIScreen mainScreen] bounds].size.width- 20.0f;//這個是必須設(shè)置的,實際上為lblel的寬度。
[self.lblContent setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];//設(shè)置讓自動布局自動的去獲取高度。
第三步,實現(xiàn)tableView的返回高度的代理在里面去獲取到布局后的高度。
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TableViewCell"];
//記得先給lblel賦值
cell.lblContent.text = self.arrData[indexPath.row];
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + 1;
//+1是因為還有分割線的高度為1
所以這里獲取的高度就是你cell自動布局后的高度,前提是你布局正確才行。
未來
隨著autoLayout的不斷的完善,在ios8以上,基本上只要你吧cell的布局正確,都可以不用去計算其高度。直接說設(shè)置下面的兩個屬性,autoLayout會自動的去幫你布局好cell的高度。
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 80;
但是一般現(xiàn)在的主流應(yīng)用基本上都是最低都要支持到iOS7,所以上面的方法基本上還是不是很實用,但是在未來的某一天你肯定會用上的,只要你還在寫iOS的代碼。
總結(jié)
上面總結(jié)了自己的一些新的,希望能夠幫助到需要的人,如果有不足之處也希望大家及時的指出。
參考文獻: