由于numberOfRowsInSection方法中返回多少数据,heightForRow就调用多少次,有几个cell进入屏幕就要调用几次
是否可以解决这种调用的频率呢?
可以利用估算高度
有两种方法设置:
1.代理方法 estimatedHeightForRowAtIndexPath
2.也可以利用属性设置,适用于每一行的估算高度都是一样的
self.tableView.estimatedRowHeight = 44
设置完估算高度后,每一行大约都是44,heightForRow方法频率就降低了
要想知道滚动条有多长,必须知道contentSize,系统已开始进入界面就已经算出了tableview的内容有多长,虽然后面的cell没有出现,就是为了滚动条的长度,为了提示用户后面大约有多少内容,所以一下子都算出来
contentSize.height --->滚动条长度,要想知道contentSize,得知道所有cell的高度,所以没有办法,只能一口气把heightForRow都调用一遍
假如有40条数据,就把40个cell的高度累加起来
但是从ios7以后,就换了一种设计,让自己去选择,要不要这样子去一下子调用,如果想告诉用户准确的滚动条长度,用系统的默认做法就好了,不用去估算
总之,目的就是为了算出滚动条的长度
有了估算高度以后,就不用着急调用heightForRow,就会用估算高度 * 总数量,算出contentsize,算出滚动条长度,这种算出来的滚动条长度是不准确的,是有误差的
用了估算高度以后,虽然heightForRow方法不会一下子调用numberOfRows返回的数据条数了,但是还是会调用是因为根据估算高度判断,一个tableView中会显示几个cell,有几个cell会进入屏幕内,就会调用几次,要显示了肯定要计算它的准确高度,而不会利用估计高度,这是不可避免的,总之,哪些cell显示,就调用哪些cell的heightForRow了,就不会一口气调用全部了,cell要真正显示了,要上场了,就有必要拿出它的真正高度了,不能用假的估算高度了,显示一个,算一个
虽然估算出来显示6个,就调用6次,但是真实的显示就4个,应该调用4次才对,虽然有误差,但是还是总的算来,还是调用的少了
如果估算高度很大的话,比如判读出来只能显示1个,那么就调用1次,发现了真实的高度,就会用真实的高度取代掉以前的估算高度,估算剩下的空间大约能显示几个,就调用几次
可用可不用,暂时选择不使用,会导致滚动条跳来跳去
网友评论