傳統(tǒng)意義上設置tableView的行高一共有四種方法暑中。等等钦讳,標題不是說有五種方法嘛。別著急掐暮,咱們先看四種最基本的方法蝎抽,最后再說第五種自動計算行高的方法。
1. 四種基本設置方法
1.1 通過代理方法設置
- 此方法可以返回每一行的具體行高.
- 代理方法設置行高調(diào)用次數(shù)特別高路克,效率很低樟结。有興致的同學可以在代理方法里面做一下輸出,在控制臺看看精算,輸出的頻率驚人狭吼。
- 為了降低調(diào)用的頻率,最好設置一個預估行高殖妇。這里說的降低頻率也只是相對的噢刁笙,依然頻率不低。
代理方法調(diào)用頻率非常的原因是想算contentSize谦趣,(UITableView是UIScrollView的子疲吸,所以繼承了UIScrollView的屬性)。如果不知道每一行的行高前鹅,就沒有辦法計算出contentSize.
代理方法如下:
//這里我們讓偶數(shù)行行高為50摘悴,奇數(shù)行為100
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row % 2 == 0) {
return 50;
}
return 100;
}
設置預估行高:
- (void)viewDidLoad {
[super viewDidLoad];
// 預估行高
self.tableView.estimatedRowHeight = 200;
}
1.2. 通過屬性設置
- cell的行高也可以在
viewDidLoad
中設置
- (void)viewDidLoad {
[super viewDidLoad];
// 設置行高
self.tableView.rowHeight = 10;
}
1.3. storyBoard中通過tableView設置
1.4. storyBoard中通過cell設置
2. 四種方法的優(yōu)先級
- 優(yōu)先等級最高:通過代理方法設置的行高
- 次高:通過屬性設置的
- 通過stroyBoard中tableView設置的
- 通過stroyBoard中cell設置的
說明: 此處也不能算是嚴格意義上的優(yōu)先等級。
- 造成這種狀況舰绘,是因為手機啟動APP的順序決定的蹂喻。
- APP在一啟動就會去通過storyBoard加載葱椭,這樣就導致了storyBoard中設置的內(nèi)容最早被加載。最后加載代理方法口四,這樣會將之前設置的內(nèi)容進行覆蓋孵运。
3. 自動進行計算cell的行高
終于來了第五種方法,這里設置約束的時候用到Masonry的第三方框架蔓彩。木有用過的童鞋可以從文章下方看到之前的分享鏈接了解治笨。
在實際開發(fā)中,很少有寫死cell高度的赤嚼。因為每個cell的內(nèi)容不太一樣旷赖,不太可能都保持統(tǒng)一的高度。當然有處女情結的產(chǎn)品經(jīng)理手頭出來的項目例外更卒,哈哈~
3.1. 步驟
- 在controller中設置預估行高和行高的自動計算
- 在cell中設置最下方的底邊約束
- 如果cell中有配圖等孵,而且是有的cell有,有的cell沒有蹂空。給配圖控件添加約束時俯萌,高度不要寫死,給一個占位約束腌闯。在設置數(shù)據(jù)時一定要注意绳瘟,有配圖就設置上; 沒有配圖姿骏,一定要把image重新寫為nil糖声。
- 我們平時設置約束很多都是上左寬高,不管底邊。但是,tableView計算行高是需要有一個底邊的約束,才能自動的根據(jù)內(nèi)容設置cell的高度
- 用代碼給cell內(nèi)部子控件設置約束自動計算行高時,最好給contentView設置"頂部"底部"及寬度約束
3.2 具體實施
3.2.1 添加預估行高分瘦、自行計算行高
//預估行高
//自動計算行高
self.tableView.rowHeight = UITableVIewAutomaticDimension;
3.2.2 設置cell最下方的底邊約束
// 設置contentView的底部約束
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
make.bottom.equalTo(moreBtn.mas_bottom).offset(DEFAULT_MARGIN);
}];
3.2.3 占位約束
make.height.lessThanEqualTo(@150);
}];
3.2.4 獲取cell最底的控件的最大的Y
這里分成兩種情況:
1蘸泻,如果最下方的控件有多個,不太容易確定到底誰最下面嘲玫。就要用代碼一悦施。
2,如果最下方的控件只有一個去团,可以直接確定最底部的控件抡诞,用代碼二。
代碼一:
// 為了自動設置行高土陪,就必須對從contentView的底邊進行約束
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
// 給底部添加了兩個約束,誰更高就用誰
make.bottom.greaterThanOrEqualTo(chatBackgroundView.mas_bottom).offset(8);
make.bottom.greaterThanOrEqualTo(headshotView.mas_bottom).offset(8);
}];
代碼二:
self.frame = CGReckMake(0,0,CGRectGetMaxY(最底部的控件.frame));
好啦~從此媽媽再也不用擔心我設置cell行高了昼汗。
自動行高的demo在這里:戳我戳我
寫完demo上傳了之后才發(fā)現(xiàn),沒寫注釋鬼雀。顷窒。。如果有看不懂的童鞋留言哈源哩,我再補充一下注釋鞋吉。
特別感謝@緣之有緣的評論哦鸦做。
之所以說是第五種,是因為基本的設置其實就依然還是4種方法谓着,根據(jù)基本的方法可以延伸出來第六種泼诱、第七種、第八種漆魔。坷檩。却音。