【轉(zhuǎn)】 iOS8新特性Self Sizing Cells,使用estimatedRowHeight自適應(yīng)cell

本文章主要介紹iOS8之后蘋果推出的一個新特性Self Sizing Cells,意思就是讓cell自己計算自己的高度,當我們在cell里面添加完所需控件,并約束好位置之后,我們只需要設(shè)置

tableView.estimatedRowHeight= 44.0f;//推測高度,必須有,可以隨便寫多少

tableView.rowHeight=UITableViewAutomaticDimension;//iOS8之后默認就是這個值,可以省略

這兩句代碼之后,即可放心的往cell的控件里面加上內(nèi)容,cell會根據(jù)內(nèi)部所有控件的高度動態(tài)的計算自己的高度從而顯示出來。這個就有點類似于html5中的body,會根據(jù)自己內(nèi)部的內(nèi)容調(diào)整自己的大小。這就給iOS開發(fā)者提供了很大的便利,不再需要之前復(fù)雜的自適應(yīng)計算方法。但是要注意的是,這個需要在iOS8之后才可以使用,如果你的應(yīng)用要適配iOS8之前的版本,可能無法使用該機制,當然也可以對系統(tǒng)版本進行判斷之后再決定使用哪一套適配方案。廢話不多說,貼代碼。

RootViewController:

#import"RootViewController.h"

#import"TestTableViewCell.h"

@interfaceRootViewController()

@property(nonatomic,strong)NSMutableArray* dataSource;

@end

@implementationRootViewController

- (void)viewDidLoad {

[superviewDidLoad];

//建立一個隨機字符串的數(shù)據(jù)源

self.dataSource= [NSMutableArraynew];

NSString* str1 =@"ell中有上下兩個Label,上面的Label只有一行文本(lines為1),所以高度在運行時不會改變,但下面的Label是多行文本(lines為0),運行時其高度會根據(jù)文本內(nèi)容自動增長。左圖中的自動布局是正確的,因此運行時單元格能夠自適應(yīng)高度。這是因為iOS能夠根據(jù)cell的contentView中的各個子View計算出cell的正常高度,計算方式為:cell高度=第1個Label的top+第1個Label高度+第2個Label的top+第2個Label高度(根據(jù)內(nèi)容自動計算)+第2個Label的bottom但是當我們將第2個Label的top約束(或者bottom約束)刪除,如右圖所示,我們已經(jīng)把圖中紅框所示位置的約束刪除了,則iOS無法計算單元格的高度了。因為上述公式中的一個變量缺失。這樣運行時表格中的所有cell都是固定高度,cell之間會發(fā)生重疊,同時控制臺會報錯:Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell’s content view. We’re considering the collapse unintentional and using standard height instead.";

NSString* str2 =@"運行時其高度會根據(jù)文本內(nèi)容自動增長。左圖中的自動布局是正確的,因此運行時單元格能夠自適應(yīng)高度。這是因為iOS能夠根據(jù)cell的contentView中的各個子View計算出cell的正常高度";

NSString* str3 =@"如右圖所示,我們已經(jīng)把圖中紅框所示位置的約束刪除了,則iOS無法計算單元格的高度了。因為上述公式中的一個變量缺失。這樣運行時表格中的所有cell都是固定高度,cell之間會發(fā)生重疊,同時控制臺會報錯:Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell’s content view. We’re considering the collapse unintentional and using standard height instead.";

for(inti = 0; i < 24; i++) {

if(i%3 == 0) {

[self.dataSourceaddObject:str1];

}elseif(i%3 == 1){

[self.dataSourceaddObject:str2];

}else{

[self.dataSourceaddObject:str3];

}

}

//創(chuàng)建一個表格視圖

UITableView* tableView = [[UITableViewalloc]initWithFrame:[UIScreenmainScreen].boundsstyle:UITableViewStylePlain];

tableView.dataSource=self;

tableView.delegate=self;

[tableViewregisterNib:[UINibnibWithNibName:@"TestTableViewCell"bundle:nil]forCellReuseIdentifier:@"CELLID"];//TestTableViewCell是使用xib創(chuàng)建,可以直接拉約束

//關(guān)鍵就是這兩句代碼,cell拉好約束寫上這兩句代碼,然后它就會根據(jù)自己的內(nèi)容計算高度了

tableView.estimatedRowHeight= 44.0f;//推測高度,必須有,可以隨便寫多少

tableView.rowHeight=UITableViewAutomaticDimension;//iOS8之后默認就是這個值,可以省略

[self.viewaddSubview:tableView];

}

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section

{

returnself.dataSource.count;

}

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

{

TestTableViewCell* cell = [tableViewdequeueReusableCellWithIdentifier:@"CELLID"forIndexPath:indexPath];

cell.label1.text=@"測試";

cell.label2.text=self.dataSource[indexPath.row];

returncell;

}

TestTableViewCell是使用xib進行創(chuàng)建的,里面有兩個cell,拉好約束,一定要注意拉約束要遵循從左到右,從上到下的規(guī)律。最終運行效果如下:

最后編輯于
?著作權(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)容