1.抖动问题:使用系统方法自动布局会造成来回切换页面数据刷新时,上下滑动会一直抖动,设置header和footer的预估高度只适用于一种header或footer的高度,如果有多种header或者footer高度不断变化,就会抖动,亲测有效。其实说到底我们的需求大部分只需要设置cell的自动布局就OK了,cell的控件比较多的情况,手动计算很繁琐,只不过是header和footer的预估高度默认就是自动布局了,我们页不会去想到是这个原因,还以为是cell的自动布局导致的抖动,那这样就直接设置header和footer的预估高度等于0禁用掉,然后在代理方法里面设置高度即可,cell的高度计算还是可以使用UITableViewAutomaticDimension计算的。
_tableView.estimatedRowHeight = 120.f;
_tableView.estimatedSectionHeaderHeight = 50.f;
_tableView.estimatedSectionFooterHeight = 60.f;
_tableView.rowHeight = UITableViewAutomaticDimension;
,
_tableView.estimatedRowHeight = 120.f;
_tableView.estimatedSectionHeaderHeight = 0;
_tableView.estimatedSectionFooterHeight = 0;//禁用掉或者准确的设置高度,否则都会造成抖动
_tableView.rowHeight = UITableViewAutomaticDimension;
其他的方法:好像不太适用我的页面,因为我这个tableview有2段接口数据分开加载显示的
// declare cellHeightsDictionary
NSMutableDictionary *cellHeightsDictionary;
// initialize in code (thanks to @Gerharbo)
cellHeightsDictionary = @{}.mutableCopy;
// declare table dynamic row height and create correct constraints in cells
tableView.rowHeight = UITableViewAutomaticDimension;
// save height
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
[cellHeightsDictionary setObject:@(cell.frame.size.height) forKey:indexPath];
}
// give exact height value
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSNumber *height = [cellHeightsDictionary objectForKey:indexPath];
if (height) return height.doubleValue;
return UITableViewAutomaticDimension;
}
2.当我滑动到当前cell时,点击上面的按钮重新加载数据刷新页面,发现整个tableview自动滑到最顶部了,我想要的效果刷新后继续停在当前cell。后面发现是因为[tableView reloadData]方法的时机不太对造成的,恰好刷新时数据源被清空或者数据源的数量改变了,所以一定要在整个数据源赋值完成之后再对整个tableview进行reload,或者只影响当前cell只刷新当前cell的方法就ok了,我这个是对整个页面的数据都有影响所以才使用[tableView reloadData]方法