MJRefresh 上拉加载多次的Bug

与预估行高有关:
在estimatedRowHeight机制下,在reloadData的时候,会重新计算contentSize,所有cell显示完后才会确定contentSize的值,这样就有可能引起contentOffset的变化,从而再次触发底部的刷新,导致你明明动了一下手,却连刷了多次的行为。

分两种情况:

一、若你在创建tableView时指定了行高:
self.lazyTableView.rowHeight = 100;
那么你需要在下面加入这句代码(值与上方一样)
self.lazyTableView.estimatedRowHeight = 100;

二、若你在创建tableView时没有指定行高,行高是动态计算的,那么就有些麻烦了:
如果你在创建tableView时 指定了预估行高:self.lazyTableView.estimatedRowHeight = 100;那么会导致在上拉加载时会多次触发加载操作。
如果你在创建tableView时禁用了预估行高:self.lazyTableView.estimatedRowHeight = 0;那么有可能导致初次进入tableView时,最上方显示的并不是第一个cell,而是中间的cell。

(以上矛盾情况出现的场景是:一个tableView下有两种自定义的cell,每个自定义cell的高度都需要动态计算)
我的解决办法是:在创建tableView时 和下拉刷新方法中,指定预估行高:self.lazyTableView.estimatedRowHeight = 100;让初次进入tableView和下拉刷新时最上方显示第一个cell; 在上拉加载的方法中禁用预估行高self.lazyTableView.estimatedRowHeight = 0;以解决上拉加载多次触发的问题。

在解决上方的问题后,又发现了一个问题:在多次上拉加载后,回到顶部进行下拉刷新后,第一行cell被导航栏遮住了一部分,解决的办法是,在下拉刷新的方法中重置contentInset:self.lazyTableView.contentInset = UIEdgeInsetsZero;

水平有限,解决了这些问题略显繁琐,若有好方法望不吝告知。

你可能感兴趣的:(MJRefresh 上拉加载多次的Bug)