tableview加入局部刷新动画reloadRowsAtIndexPaths:后出现的坑

来源:互联网 发布:linux printf 串口 编辑:程序博客网 时间:2024/06/06 20:03

最近项目出了个需求,需要点击tableview的sectionheader的时候动画展开和收起section下的cell,所以利用苹果自带的tableview方法实现这个效果:



点击header的时候就执行这块代码,编译运行,一切正常。


但是一切并没有想象中顺利,bug无处不在。。。。

我发现cell高度大于50的时候就会有约束报错,并且sectionheader位置错位

直接上图给大家看看:


这里出现两种情况:

1.这个是headerview错位了,只要我网上滚动再往下滚动,等于是重用了一下headerview就好了,这个应该是重新布局就修复了错位问题。

2.或者不用reloadRowsAtIndexPaths:刷新,换成reloaddata就不出现bug了。

3.只要把tableview滑动到底部,点击收起和展开动画,使用局部刷新,动画完了之后就会错位。


然后看见报错信息建议删除headerView子控件边距的约束,我想到了以前做xib动态计算cell高度的坑。


然后我把右边和下面的边距约束删掉,加上宽高约束。



好了,做到这里,测试一下,bug貌似没了。松一口气~


但是。。。

以为bug就此解决?太天真了

经过我反复测试之后,我发现当cell和section数目多了之后,点击执行动画,bug还在。。。。主要表现为,当滑到tableview最底的时候,点击headerview让cell收合,sectionheaderview的错位显示。

举个栗子:



当出现图中这种情况的时候,点击“123”的headerview让cell收起,就会出现“123”的headerview错位,正确来说也不能叫错位,就是在tableview的底部会伶仃的出现一个“123”的headerview,估计是重用的问题,当再次点击“123”展开cell的时候,第二个“123”headerview就会盖住了部分的cell,反正就是在屏幕里不走。我试过其他情况不会,就这个情况都被我遇上了。。。

最后我在网上搜索并找不到答案,后来在github下载了一个别人写的项目,也是做了收起展开的动画,因为我不知道bug的问题出在哪,所以花了好长时间去每一个地方对比,那真是蛋疼,最后发现原因在这:

高度估算的代理方法

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

因为我加了高度估算的代理方法,估计是这里影响了tableview的布局计算,我把这两个方法去掉,在加上



测试一下,好了。


问题就这样解决了,估计是我写的约束和苹果内部的布局机制冲突,xib动态计算cell高度也是需要这样的布局,这种布局有点像scrollview里面子控件的布局有点相似.

好了。测试了一下,问题解决~