本文章主要介紹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ī)律。最終運行效果如下: