本文章主要介紹iOS8之后蘋(píng)果推出的一個(gè)新特性Self Sizing Cells,意思就是讓cell自己計(jì)算自己的高度昆禽,當(dāng)我們?cè)赾ell里面添加完所需控件蝗蛙,并約束好位置之后,我們只需要設(shè)置
tableView.estimatedRowHeight = 44.0f;//推測(cè)高度醉鳖,必須有捡硅,可以隨便寫(xiě)多少
tableView.rowHeight =UITableViewAutomaticDimension;//iOS8之后默認(rèn)就是這個(gè)值,可以省略
這兩句代碼之后盗棵,即可放心的往cell的控件里面加上內(nèi)容壮韭,cell會(huì)根據(jù)內(nèi)部所有控件的高度動(dòng)態(tài)的計(jì)算自己的高度從而顯示出來(lái)北发。這個(gè)就有點(diǎn)類(lèi)似于html5中的body,會(huì)根據(jù)自己內(nèi)部的內(nèi)容調(diào)整自己的大小喷屋。這就給iOS開(kāi)發(fā)者提供了很大的便利琳拨,不再需要之前復(fù)雜的自適應(yīng)計(jì)算方法。但是要注意的是屯曹,這個(gè)需要在iOS8之后才可以使用狱庇,如果你的應(yīng)用要適配iOS8之前的版本,可能無(wú)法使用該機(jī)制恶耽,當(dāng)然也可以對(duì)系統(tǒng)版本進(jìn)行判斷之后再?zèng)Q定使用哪一套適配方案密任。廢話不多說(shuō),貼代碼偷俭。RootViewController:
import "RootViewController.h"
import "TestTableViewCell.h"
@interface RootViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic,strong) NSMutableArray * dataSource;
@end
@implementation RootViewController
-
(void)viewDidLoad {
[superviewDidLoad];//建立一個(gè)隨機(jī)字符串的數(shù)據(jù)源
self.dataSource = [NSMutableArraynew];
NSString * str1 =@"ell中有上下兩個(gè) Label浪讳,上面的Label只有一行文本(lines為1),所以高度在運(yùn)行時(shí)不會(huì)改變涌萤,但下面的Label是多行文本(lines為0)淹遵,運(yùn)行時(shí)其高度會(huì)根據(jù)文本內(nèi)容自動(dòng)增長(zhǎng)。左圖中的自動(dòng)布局是正確的形葬,因此運(yùn)行時(shí)單元格能夠自適應(yīng)高度合呐。這是因?yàn)?a target="_blank" rel="nofollow">iOS能夠根據(jù)cell的contentView中的各個(gè)子View計(jì)算出cell的正常高度,計(jì)算方式為:cell高度 = 第1個(gè)Label的top+第1個(gè)Label高度+第2個(gè)Label的top+第2個(gè)Label高度(根據(jù)內(nèi)容自動(dòng)計(jì)算)+第2個(gè)Label的bottom但是當(dāng)我們將第2個(gè)Label的top約束(或者bottom約束)刪除笙以,如右圖所示淌实,我們已經(jīng)把圖中紅框所示位置的約束刪除了,則iOS無(wú)法計(jì)算單元格的高度了猖腕。因?yàn)樯鲜龉街械囊粋€(gè)變量缺失拆祈。這樣運(yùn)行時(shí)表格中的所有cell都是固定高度,cell之間會(huì)發(fā)生重疊倘感,同時(shí)控制臺(tái)會(huì)報(bào)錯(cuò):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 =@"運(yùn)行時(shí)其高度會(huì)根據(jù)文本內(nèi)容自動(dòng)增長(zhǎng)放坏。左圖中的自動(dòng)布局是正確的,因此運(yùn)行時(shí)單元格能夠自適應(yīng)高度老玛。這是因?yàn)閕OS能夠根據(jù)cell的contentView中的各個(gè)子View計(jì)算出cell的正常高度";
NSString * str3 =@"如右圖所示淤年,我們已經(jīng)把圖中紅框所示位置的約束刪除了,則iOS無(wú)法計(jì)算單元格的高度了蜡豹。因?yàn)樯鲜龉街械囊粋€(gè)變量缺失麸粮。這樣運(yùn)行時(shí)表格中的所有cell都是固定高度,cell之間會(huì)發(fā)生重疊镜廉,同時(shí)控制臺(tái)會(huì)報(bào)錯(cuò):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)建一個(gè)表格視圖
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)建弄诲,可以直接拉約束//關(guān)鍵就是這兩句代碼,cell拉好約束寫(xiě)上這兩句代碼娇唯,然后它就會(huì)根據(jù)自己的內(nèi)容計(jì)算高度了
tableView.estimatedRowHeight = 44.0f;//推測(cè)高度齐遵,必須有寂玲,可以隨便寫(xiě)多少
tableView.rowHeight =UITableViewAutomaticDimension;//iOS8之后默認(rèn)就是這個(gè)值,可以省略[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 =@"測(cè)試";
cell.label2.text =self.dataSource[indexPath.row];
return cell;
}
TestTableViewCell是使用xib進(jìn)行創(chuàng)建的梗摇,里面有兩個(gè)cell拓哟,拉好約束,一定要注意拉約束要遵循從左到右留美,從上到下的規(guī)律彰檬。最終運(yùn)行效果如下: