UITableViewCell高度計算的前世今生

前言

?對于每個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é)了自己的一些新的,希望能夠幫助到需要的人,如果有不足之處也希望大家及時的指出。

參考文獻:

http://www.starming.com/index.php?v=index&view=81

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容