UITableView方法的执行顺序

UITableView方法执行顺序
一、估算方法实现 估算高度不为0

1.确定单元数  
numberOfSectionsInTableView

numberOfSectionsInTableView
/
2.确定每单元的表头尾预估高度
estimatedHeightForHeaderInSection - section
estimatedHeightForFooterInSection - section
3.确定行数
numberOfRowsInSection - section
4.确定cell预估高度
estimatedHeightForRow - section - row * rowNumber
/ *sectionNumber

numberOfSectionsInTableView
/
estimatedHeightForHeaderInSection - section
estimatedHeightForFooterInSection - section
numberOfRowsInSection - section
estimatedHeightForRow - section - row * rowNumber
/ *sectionNumber

/
5.获取cell
cellForRowAtIndexPath - section - row
6.返回cell的高度
heightForRow - section - row
7.返回footerView的高度
heightForFooter - section  — > - section - 0
8.cell将在屏幕显示
willDisplayCell - section - row
/ *sectionNumber *rowNumber

/
9.返回headerView的高度
heightForHeader - section
10.显示headerView
viewForHeaderInSection - section
11.headerView将在屏幕显示
willDisplayHeaderView - section
12.显示footerView
viewForFooterInSection - section
13.footerView将在屏幕显示
willDisplayFooterView - section
/ *sectionNumber

/
14.再次返回cell的高度
heightForRow - section - row
/ *sectionNumber *rowNumber


//高度超出屏幕继续下拉  - 5, 6, 8 方法
/
cellForRowAtIndexPath - section - row
heightForRow - section - row
willDisplayCell - section - row
/ *sectionNumber *(rowNumber - screenRows)

二、估算方法实现 估算高度为0 设置表头尾失败 不要这么设置

1.确定单元数
numberOfSectionsInTableView

numberOfSectionsInTableView
/
2.确定每单元的表头尾预估高度
estimatedHeightForHeaderInSection - section
estimatedHeightForFooterInSection - section
3.确定行数
numberOfRowsInSection - section
4.确定cell预估高度
estimatedHeightForRow - section - row * rowNumber
/ *sectionNumber

numberOfSectionsInTableView
/
estimatedHeightForHeaderInSection - section
estimatedHeightForFooterInSection - section
numberOfRowsInSection - section
estimatedHeightForRow - section - row * rowNumber
/ *sectionNumber

/
5.获取cell
cellForRowAtIndexPath - section - row
6.返回cell的高度
heightForRow - section - row
7.cell将在屏幕显示
willDisplayCell - section - row
/ *sectionNumber *rowNumber

//高度超出屏幕继续下拉 5, 6, 7
/
cellForRowAtIndexPath - section - row
heightForRow - section - row
willDisplayCell - section - row
/ *sectionNumber *(rowNumber - screenRows)

三、初始化时使估算高度失效

viewDidLoad
{
    self.tableView.estimatedRowHeight = 0;
    self.tableView.estimatedSectionHeaderHeight = 0;
    self.tableView.estimatedSectionFooterHeight = 0;
}
1.确定单元数
numberOfSectionsInTableView

numberOfSectionsInTableView
/
2.确定每单元的表头尾高度
heightForHeader - section
heightForFooter - section
3.确定行数
numberOfRowsInSection - section
4.确定cell高度
heightForRow - section - row * rowNumber
/ *sectionNumber

numberOfSectionsInTableView
/
heightForHeader - section
heightForFooter - section
numberOfRowsInSection - section
heightForRow - section - row * rowNumber
/ *sectionNumber

/
5.获取cell
cellForRowAtIndexPath - section - row
6.返回cell的高度
heightForRow - section - row
7.cell将在屏幕显示
willDisplayCell - section - row
/ *sectionNumber *rowNumber

/
8.显示headerView
viewForHeaderInSection - section
9.headerView将在屏幕显示
willDisplayHeaderView - section
10.显示footerView
viewForFooterInSection - section
11.footerView将在屏幕显示
willDisplayFooterView - section
/ *sectionNumber

//高度超出屏幕继续下拉 5, 6, 7
/
cellForRowAtIndexPath - section - row
heightForRow - section - row
willDisplayCell - section - row
/ *sectionNumber *(rowNumber - screenRows)

PS:
1.尽量在初始化tableView时设置高度属性

self.tableView.rowHeight = ;
self.tableView.sectionHeaderHeight = ;
self.tableView.sectionFooterHeight = ;

self.tableView.estimatedRowHeight = ;
self.tableView.estimatedSectionHeaderHeight = ;
self.tableView.estimatedSectionFooterHeight = ;

目的:减少方法执行
在初始化设置,不写相关代理方法,则
estimatedHeightForHeaderInSection / estimatedHeightForFooterInSection / estimatedHeightForRow
heightForHeader / heightForFooter / heightForRow 方法不会执行

2.初始化时设置

self.tableView.estimatedRowHeight = 0; // set to 0 to disabled
self.tableView.estimatedSectionHeaderHeight = 0; // set to 0 to disabled
self.tableView.estimatedSectionFooterHeight = 0; // set to 0 to disabled

则计算高度为heightForHeader / heightForFooter / heightForRow方法,否则计算高度为estimatedHeightForHeaderInSection / estimatedHeightForFooterInSection / estimatedHeightForRow (两种代理方法同时调用的前提下)

3.如果设置了headerView / footerView,
estimatedHeightForHeaderInSection / estimatedHeightForFooterInSection(估算高度设为0则只调用1次) // heightForHeader / heightForFooter 方法会连续调用2次

你可能感兴趣的