很多人肯定都很困惑,UITableView如何算高度才最高效。
首先我们来理解一下UITableView的实现原理:
UITableView使用了重用机制,在其回调当中优先掉用
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 方法;然后再调用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法;
这对于很多喜欢在cellForRowAtIndexPath:方法中自定义cell,再计算高度的开发者而言很蛋疼;因为他在没创建cell之前,根本就不知道高度。
按照一般的开发思路,应该是先创建自定义的cell,然后设置内容、布局;然后再返回高度。但apple的实现思路确是:先把位置定好,再在对应的位置放cell。
特别注意:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 方法在UITableView刷新时都会调用一次;即如果是10个cell,你不管是reloadData、还是reloadCell都会调用10次上述方法;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法在reloadCell的时候只会调用一次。
知道reloadData、reloadCell的区别后,根据情况调用。
计算高度方法:
1、用一个数组保存cell或cell的高度值:
height:获得cell,返回高度,在数组中保存cell;
cell:从数组中获取,直接返回。
2、在height方法中调用cell方法,返回高度:
height:
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
return cell.frame.size.height;
cell:正常处理。
3、apple最希望开发者这样做的:
height:
设置一个全局变量cell对象,自定义cell添加一个计算高度的方法-getHeight:和设置内容-setContent:的方法;
切记为了效率,在计算高度的方法中,尽量不要涉及赋值,算布局的复杂代码,只要能得到高度即可,越简单越好;因为height:该方法在reload的时候调用次数最多。
在设置内容方法中,只设置内容就可。
以上只是我想到的计算UITableView高度的方法,我个人觉得第三种最高效;
如果哪位大神有更好的方法,求赐教!!