1.iOS8及以后,通過XIb自定義不等高cell: ? ? ? ?下載
// 告訴tableView所有cell的真實高度是自動計算(根據設置的約束來計算)self.tableView.rowHeight = UITableViewAutomaticDimension;
// 告訴tableView所有cell的估算高度
self.tableView.estimatedRowHeight = 44;
注意一點的是在Xib中設置自動換行Lable的時候要設置lable和cell底部的約束如圖:
運行效果如下:
2.(估計現在都沒人用了簡單介紹一下)如果要支持iOS7及之前如果cell內部有自動換行的label,需要設置preferredMaxLayoutWidth屬性
1.如果cell內部有自動換行的label,需要設置preferredMaxLayoutWidth屬性
- (void)awakeFromNib
{// 手動設置文字的最大寬度(為了讓label知道自己文字的最大寬度,進而能夠計算出自己的frame)
self.titleLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
}
2.還要在tableView的設置cell估算高度
// 告訴tableView所有cell的估算高度(設置了估算高度,就可以減少tableView:heightForRowAtIndexPath:方法的調用次數)
self.tableView.estimatedRowHeight = 80;
3.在代理方法中計算cell的高度
DemoCell *cell;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 創建一個臨時的cell(cell的作用:根據模型數據布局所有的子控件,進而計算出cell的高度)
if (!cell) {
cell = [tableView dequeueReusableCellWithIdentifier:ID];
}
// 設置模型數據
...
return cell.height;
}
// heightForRowAtIndexPath中調用的返回cell高度的方法
- (CGFloat)height
{
// 強制布局cell內部的所有子控件(label根據文字多少計算出自己最真實的尺寸)
[self layoutIfNeeded];
// 計算cell的高度
if (...) {
return ...;
} else {
return ...;
}
}
3.通用規則代碼設置
設置思路如下:
所有涉及基于純代碼原則
1.建立Modle模型
2.根據Modle模型建立framModle模型并計算出控件的Fram
3.在cell中設置子控件并設置Fram
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
//設置子控件
[self setupchildrenView];
}
return self;
}
- (void)setFramModle:(myFootPrintFramModle *)framModle{
_framModle=framModle;
myFootPrintDataModle *dataModle=framModle.modle;
//設置控件的Fram和數據
}
4.在代理方法設置返回的行高
- (CGFloat )tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
myFootPrintDataSectionModle *Modle=self.dataArray[indexPath.section];
myFootPrintFramModle *framMod=Modle.dataArray[indexPath.row];
return framMod.cellHeight;
}
簡述一下方法一和方法三的優缺點:
方法一:對于一些比較簡單的界面,如上圖,Xib拖控件兩句話就可以搞定很方便。缺點就是比如下面的界面就不好控制了:
實現根據數據的不同,排列圖片,以及對下面轉發,評論,點贊工具條的設計,這個很明顯把圖片和工具條單獨的功能繁多我們需要分開來寫,這樣就需要代碼進行實現了(這個只是本人的思路),具體根據開發遇到的問題決定