近日翰蠢,出現(xiàn)一個很奇怪的bug项乒,當(dāng)列表的上下滑動區(qū)域比屏幕大一點(diǎn)的時候,下載刷新cell的時候梁沧,會導(dǎo)致列表偏移一下
定位問題
遇到問題了檀何,首先要找出來問題是如何出現(xiàn)的,為什么會偏移呢廷支?
- 第一步:找出誰導(dǎo)致的
UITableView
偏移
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"offset ====%f",scrollView.contentOffset.y);
if (scrollView.contentOffset.y != 0) {
NSLog(@"contentOffset y");
}
}
在以上方法中频鉴,添加斷點(diǎn),發(fā)現(xiàn)是三方類庫里面調(diào)用導(dǎo)致的
進(jìn)入三方的
UITableView+FDIndexPathHeightCache
中發(fā)現(xiàn)恋拍,reloadRowsAtIndexPaths
方法已經(jīng)被交換垛孔,那我先注釋掉,看看是不是此處引發(fā)的bug呢施敢。注釋掉之后周荐,發(fā)現(xiàn)還是存在這個問題
發(fā)現(xiàn)是
reloadRowsAtIndexPaths
方法導(dǎo)致contentOffset
。
- 找到哪個方法觸發(fā)的偏移之后僵娃,那么就去萬能的stackoverflow上面搜解決方法了概作,果然找到了解決方法。
2.1 問題的原因是:因?yàn)橐恍┥衩氐脑颍?code>tableview刷新的時候默怨,會使用到預(yù)估的行高讯榕,如果你沒有設(shè)置預(yù)估的行高的話,會出現(xiàn)上下滑動的效果匙睹,你可以緩存你的行高瘩扼,在estimatedHeightForRowAtIndexPath
中返回緩存的行高谆甜。
解決有兩種方式:
方式一:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 85;
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 85;
}
方式二:
_downloadTableView.estimatedRowHeight = 85;
_downloadTableView.rowHeight = 85;
系統(tǒng)的API有許多讓人意想不到的坑,在開發(fā)的過程中給開發(fā)者造成不小的困擾集绰,希望以后系統(tǒng)API的穩(wěn)定性能夠更高一些规辱。