在開發(fā)中也遇到了UITableView刷新跳動的問題绸狐,搜索一下解決方案,但是基本都是如下的做法
_tableView.estimatedRowHeight = 0;
_tableView.estimatedSectionHeaderHeight = 0;
_tableView.estimatedSectionFooterHeight = 0;
這一方案實際上是禁用了自動計算累盗,從而使UITableView刷新不再跳動寒矿。
但是這是一個帶有誤傷的方案。estimatedRowHeight = 0 同時禁用了方便的AutomaticDimension若债。
對于手動計算高度的方式符相,這樣是沒什么問題的,但是如果用到了AutomaticDimension蠢琳,怎么辦呢啊终。
一個簡單有效的方案,就是緩存高度傲须。
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSNumber *heightNumber = [self.cellHeightDict objectForKey:indexPath];
CGFloat height = 50;
if(heightNumber)
{
height = heightNumber.floatValue;
}
return height;
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat cellHeight = cell.frame.size.height;
[self.cellHeightDict setObject:@(cellHeight) forKey:indexPath];
}
方案的本質(zhì)是提供準(zhǔn)確的estimatedRowHeight使得UITableView的contentSize計算準(zhǔn)確蓝牲,從而不會產(chǎn)生所謂的跳動現(xiàn)象。
這其實也揭示了一點泰讽,estimatedRowHeight其實并非應(yīng)該隨意設(shè)置搞旭,而是應(yīng)該盡可能的準(zhǔn)確,日常使用可能會忽略這一點菇绵,所以會有許多奇怪的bug出現(xiàn)肄渗,這些都是沒有準(zhǔn)確使用的結(jié)果。(當(dāng)然咬最,會有一些準(zhǔn)確使用也有的奇怪問題)
當(dāng)然翎嫡,如果Header和Footer也使用estimated的話,就在willDisplayHeaderView 和 willDisplayFooterView 把實際高度也存儲起來就行了永乌。不需要的話就把estimated設(shè)置為0惑申。