本文章主要介紹iOS8之后蘋果推出的一個新特性Self Sizing Cells,意思就是讓cell自己計算自己的高度,當我們在cell里面添加完所需控件,并約束好位置之后,我們只需要設置
tableView.estimatedRowHeight = 44.0f;//推測高度,必須有,可以隨便寫多少
tableView.rowHeight =UITableViewAutomaticDimension;//iOS8之后默認就是這個值,可以省略
這兩句代碼之后,即可放心的往cell的控件里面加上內容,cell會根據(jù)內部所有控件的高度動態(tài)的計算自己的高度從而顯示出來。這個就有點類似于html5中的body,會根據(jù)自己內部的內容調整自己的大小。這就給iOS開發(fā)者提供了很大的便利,不再需要之前復雜的自適應計算方法。但是要注意的是,這個需要在iOS8之后才可以使用,如果你的應用要適配iOS8之前的版本,可能無法使用該機制,當然也可以對系統(tǒng)版本進行判斷之后再決定使用哪一套適配方案。廢話不多說,貼代碼。RootViewController:
import "RootViewController.h"
import "TestTableViewCell.h"
@interface RootViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic,strong) NSMutableArray * dataSource;
@end
@implementation RootViewController
-
(void)viewDidLoad {
[superviewDidLoad];//建立一個隨機字符串的數(shù)據(jù)源
self.dataSource = [NSMutableArraynew];
NSString * str1 =@"ell中有上下兩個 Label,上面的Label只有一行文本(lines為1),所以高度在運行時不會改變,但下面的Label是多行文本(lines為0),運行時其高度會根據(jù)文本內容自動增長。左圖中的自動布局是正確的,因此運行時單元格能夠自適應高度。這是因為iOS能夠根據(jù)cell的contentView中的各個子View計算出cell的正常高度,計算方式為:cell高度 = 第1個Label的top+第1個Label高度+第2個Label的top+第2個Label高度(根據(jù)內容自動計算)+第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ù)文本內容自動增長。左圖中的自動布局是正確的,因此運行時單元格能夠自適應高度。這是因為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 (int i = 0; i < 24; i++) {
if (i%3 == 0) {
[self.dataSourceaddObject:str1];
}else if (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;
[tableView registerNib:[UINibnibWithNibName:@"TestTableViewCell"bundle:nil]forCellReuseIdentifier:@"CELLID"];//TestTableViewCell是使用xib創(chuàng)建,可以直接拉約束//關鍵就是這兩句代碼,cell拉好約束寫上這兩句代碼,然后它就會根據(jù)自己的內容計算高度了
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];
return cell;
}
TestTableViewCell是使用xib進行創(chuàng)建的,里面有兩個cell,拉好約束,一定要注意拉約束要遵循從左到右,從上到下的規(guī)律。最終運行效果如下: