[经验]tableview的contentSize默默自己在变。

版权声明:原创文章,未经博主允许禁止转载。欢迎点击头像上方“郭晓东的专栏”查看专栏 https://blog.csdn.net/hherima/article/details/72189973

    项目中遇到一个诡异的问题:tableview的contentSize在滚动的时候自动在变小。这里先说一下项目环境:UIViewController有个tableview,可以通过上拉加载,实现加载更多数据。在一日测试中发现,一直上拉,上拉到第三页的时候。页面反而滚动到了顶部惊讶。上拉加载更多,结果应该是tableview显示底部数据,contentoffset应该是一个比较大的值。现在却弹回去了。看看输出日志

2017-05-15 18:42:10.316 HUVideoHD[25980:457096] scrollView offset = 612.000000
2017-05-15 18:42:10.317 HUVideoHD[25980:457096] scrollView offset = 612.000000
2017-05-15 18:42:10.340 HUVideoHD[25980:457096] scrollView offset = 688.500000
2017-05-15 18:42:10.357 HUVideoHD[25980:457096] scrollView offset = 726.500000
2017-05-15 18:42:10.358 HUVideoHD[25980:457096] scrollView offset = 606.000000
2017-05-15 18:42:10.359 HUVideoHD[25980:457096] scrollView contentsize = {680, 899}
2017-05-15 18:42:10:360 HUVideoHD[25980:457096] [M9Request 26] begin - http://xxxxx/v4/album/videos/1007177.json?page_size=50&api_key=88a12cee7016fe81ac2ab686d918bc7c&plat=1&partner=6933&sver=6.7&poid=1&page=3&with_fee_video=3&with_trailer=1&prevideo_rule=3
2017-05-15 18:42:10.365 HUVideoHD[25980:457096] scrollView offset = 537.000000
2017-05-15 18:42:10.365 HUVideoHD[25980:457096] scrollView contentsize = {680, 830}
2017-05-15 18:42:10.369 HUVideoHD[25980:457096] scrollView offset = 468.000000
2017-05-15 18:42:10.370 HUVideoHD[25980:457096] scrollView contentsize = {680, 761}
2017-05-15 18:42:10.373 HUVideoHD[25980:457096] scrollView offset = 399.000000
2017-05-15 18:42:10.373 HUVideoHD[25980:457096] scrollView contentsize = {680, 692}
2017-05-15 18:42:10.377 HUVideoHD[25980:457096] scrollView offset = 330.000000
2017-05-15 18:42:10.377 HUVideoHD[25980:457096] scrollView contentsize = {680, 623}
2017-05-15 18:42:10.381 HUVideoHD[25980:457096] scrollView offset = 261.000000
2017-05-15 18:42:10.381 HUVideoHD[25980:457096] scrollView contentsize = {680, 554}
2017-05-15 18:42:10.384 HUVideoHD[25980:457096] scrollView offset = 192.000000
2017-05-15 18:42:10.384 HUVideoHD[25980:457096] scrollView contentsize = {680, 485}
2017-05-15 18:42:10.407 HUVideoHD[25980:457096] scrollView offset = 294.000000
2017-05-15 18:42:10.424 HUVideoHD[25980:457096] scrollView offset = 305.000000
2017-05-15 18:42:10.440 HUVideoHD[25980:457096] scrollView offset = 310.000000
2017-05-15 18:42:10.457 HUVideoHD[25980:457096] scrollView offset = 309.500000
2017-05-15 18:42:10.474 HUVideoHD[25980:457096] scrollView offset = 306.500000
2017-05-15 18:42:10.490 HUVideoHD[25980:457096] scrollView offset = 301.000000
2017-05-15 18:42:10.507 HUVideoHD[25980:457096] scrollView offset = 294.000000
2017-05-15 18:42:10.524 HUVideoHD[25980:457096] scrollView offset = 286.500000
2017-05-15 18:42:10.540 HUVideoHD[25980:457096] scrollView offset = 278.500000
2017-05-15 18:42:10.557 HUVideoHD[25980:457096] scrollView offset = 271.000000
2017-05-15 18:42:10.561 HUVideoHD[25980:457096] scrollView offset = 123.000000
2017-05-15 18:42:10.561 HUVideoHD[25980:457096] scrollView contentsize = {680, 416}
2017-05-15 18:42:10.598 HUVideoHD[25980:457096] scrollView offset = 127.500000
2017-05-15 18:42:10.607 HUVideoHD[25980:457096] scrollView offset = 132.000000
2017-05-15 18:42:10.624 HUVideoHD[25980:457096] scrollView offset = 133.500000
2017-05-15 18:42:10.641 HUVideoHD[25980:457096] scrollView offset = 133.500000
2017-05-15 18:42:10.657 HUVideoHD[25980:457096] scrollView offset = 133.500000
2017-05-15 18:42:10.674 HUVideoHD[25980:457096] scrollView offset = 133.500000
2017-05-15 18:42:10.691 HUVideoHD[25980:457096] scrollView offset = 133.000000
2017-05-15 18:42:10.708 HUVideoHD[25980:457096] scrollView offset = 132.500000
2017-05-15 18:42:10.724 HUVideoHD[25980:457096] scrollView offset = 131.500000
2017-05-15 18:42:10.740 HUVideoHD[25980:457096] scrollView offset = 131.000000
2017-05-15 18:42:10.757 HUVideoHD[25980:457096] scrollView offset = 130.000000
2017-05-15 18:42:10.774 HUVideoHD[25980:457096] scrollView offset = 129.500000
2017-05-15 18:42:10.790 HUVideoHD[25980:457096] scrollView offset = 129.000000
2017-05-15 18:42:10.807 HUVideoHD[25980:457096] scrollView offset = 128.000000
2017-05-15 18:42:10.824 HUVideoHD[25980:457096] scrollView offset = 127.500000
2017-05-15 18:42:10.840 HUVideoHD[25980:457096] scrollView offset = 127.000000
2017-05-15 18:42:10.857 HUVideoHD[25980:457096] scrollView offset = 126.500000
2017-05-15 18:42:10.873 HUVideoHD[25980:457096] scrollView offset = 126.000000
2017-05-15 18:42:10.890 HUVideoHD[25980:457096] scrollView offset = 126.000000
2017-05-15 18:42:10.907 HUVideoHD[25980:457096] scrollView offset = 125.500000
2017-05-15 18:42:10.923 HUVideoHD[25980:457096] scrollView offset = 125.000000
2017-05-15 18:42:10.940 HUVideoHD[25980:457096] scrollView offset = 125.000000
2017-05-15 18:42:10.958 HUVideoHD[25980:457096] scrollView offset = 124.500000
2017-05-15 18:42:10.974 HUVideoHD[25980:457096] scrollView offset = 124.500000
2017-05-15 18:42:10.991 HUVideoHD[25980:457096] scrollView offset = 124.000000
2017-05-15 18:42:11.007 HUVideoHD[25980:457096] scrollView offset = 124.000000
2017-05-15 18:42:11.023 HUVideoHD[25980:457096] scrollView offset = 124.000000
2017-05-15 18:42:11.041 HUVideoHD[25980:457096] scrollView offset = 124.000000
2017-05-15 18:42:11.057 HUVideoHD[25980:457096] scrollView offset = 123.500000
2017-05-15 18:42:11.074 HUVideoHD[25980:457096] scrollView offset = 123.500000
2017-05-15 18:42:11.091 HUVideoHD[25980:457096] scrollView offset = 123.500000
2017-05-15 18:42:11.107 HUVideoHD[25980:457096] scrollView offset = 123.500000
2017-05-15 18:42:11.108 HUVideoHD[25980:457096] scrollView offset = 123.000000
2017-05-15 18:42:17:501 HUVideoHD[25980:457096] [M9Request 26] end - 请求成功
2017-05-15 18:42:17.516 HUVideoHD[25980:457096] scrollView offset = 63.000000
2017-05-15 18:42:17.516 HUVideoHD[25980:457096] scrollView contentsize = {680, 416}
2017-05-15 18:42:17.518 HUVideoHD[25980:457096] scrollView offset = 63.000000
2017-05-15 18:42:17.518 HUVideoHD[25980:457096] scrollView contentsize = {680, 1244}

第7行是加载更多的网络请求,就是从这个时候,contentOffset和contentsize开始变小。第65行,数据请求成功。contentOffset和contentsize恢复正常值。

随着时间推移,scrollerView offset竟然是越来越小,奇怪的是日志上半部分contentSize也在越来越小。好,就开始查:

1. 查了tableview的数据源,看是不是数据源变少了。结果是:tableview的数据源是正确的,没变小,一直在变大(上拉成功,新的数据下来,数据源自然更多了)
2. google了一下什么情况下contentsize会自动变化,有网友说是动态cell的height问题。那么我也查了一下- (CGFloat)tableView: heightForRowAtIndexPath:代理方法。果然,找到问题了:看看问题代码什么样子:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat height = 0;
	if (self.dramaVideoListLoadState == MidPageVideoListLoaded){
                    if ([self isVideoPureMovie]){
                        height = kMidPageFSMovieDramaCellHeight;
                    }else{
                        height = kMidPageFSDramaRowHeight;
                    }
                }
	else{
        /*!!!:这里不就返回0了么*/
	}
    return height
}

在有网络请求中的时候:cellheight竟然是0,网络请求完成,celheight就是正常值了。这就可以猜测一下日志的诡异输出了:刷新tableview的时候,原本tableview有contentoffset,但是经过cellheight=0 就是等于在减少contentsize,offset也会减小。最后网络请求成功,cellheight恢复正常值。contentsize就恢复了,但是contentoffset是没法自动恢复了难过,所以就造成这个现象:越向上拉,越往上偏移

猜你喜欢

转载自blog.csdn.net/hherima/article/details/72189973