Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 413|回复: 0

下拉刷新和UITableView的section headerView冲突的原因分析与解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-9-22 15:19
  • 签到天数: 795 天

    [LV.10]以坛为家III

    2050

    主题

    2108

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    724084
    发表于 2021-7-7 03:52:40 | 显示全部楼层 |阅读模式

    UITableView:下拉刷新和上拉加载更多

    【转载请注明出处】

     

    本文将说明具有多个section的UITableView在使用下拉刷新机制时会遇到的问题及其解决方案。

    工程地址在帖子最下方,只需要代码的直拉到底即可。

     

    【目录】

    1、现象分析;

    2、解决方案;

    3、工程地址。 

     

    1、现象分析 
    当前的大多数支持下拉刷新的库,都是通过修改UIScrollView的contentInset实现的。

    (可参见我的这篇帖子:UITableView:下拉刷新和上拉加载更多

    使用这种方法带来的问题是,当UITableView具有多个section时,依照上述方式使用下拉刷新,在加载过程中上滑,会出现样式跑版:

     

     

    为了分析出问题所在,首先在控制台打印出正常状态下UITableView的所有子View :

     

    比较各行的frame.origin.y可以看出,UITableView的section headerView是和cell一起,按顺序放入基类UIScrollView的内容View中的。

    再看加载中的情况:

     从Pull2RefreshView的frame可以看出,此时UITableView的contentInset已经被修改为(65, 0, 0, 0)。而section headerView和各个cell的frame.origin.y不受影响,和预期一致。

    最后看看在加载中状态下上滑时的情况,将UITableView上滑至上方图中所示情境,即第一行的cell刚刚好越过section headerView:

    可以看到,section headerView的frame.origin.y发生了变化,它和第二个cell一起被放在了第一个cell的下方,即:

    section headerView.frame.origin.y == firstCell.frame.origin.y + cellHeight;

    继续上滑,可以看到section headerView.frame.origin.y不断变化,但在界面显示上,始终位于距离UITableView.frame.origin.y为65(即修改后contengInset.top的值)的位置,直到下一个section headerView出现时,才随着cell向上移动,如图:
     

     

    注意:不论在任何情况下,第一个cell的frame.origin.y始终为section headerView的高度,在本例中为23,即使它已经处于section headerView的上方】 

     

    2、解决方案 

     由此,可以粗略得出以下结论:

    A、 section headerView和cell之间并不是简单的顺序摆放的关系,它们之间可以发生重叠;

    B、 section headerView在界面上的显示位置由UITableView.contentInset.top决定,直到被下一个section headerView替代。 

    如此,想要在滑动时修改section headerView的显示位置,令其和cell一起移动,只需要动态地修改UITableView.contentInset.top即可,如下:

     1  - ( void)scrollViewDidScroll:(UIScrollView *)scrollView
     2   {
     3        // added 2013.11.28 动态修改headerView的位置
     4        if (headerRefreshing)
     5       {
     6            if (scrollView.contentOffset.y >= -scrollView.contentInset.top
     7               && scrollView.contentOffset.y <  0)
     8           {
     9                // 注意:修改scrollView.contentInset时,若使当前界面显示位置发生变化,会触发scrollViewDidScroll:,从而导致死循环。
    10                // 因此此处scrollView.contentInset.top必须为-scrollView.contentOffset.y
    11              scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y,  000);
    12          }
    13           else  if (scrollView.contentOffset.y ==  0) // 到0说明headerView已经在tableView最上方,不需要再修改了
    14          {
    15              scrollView.contentInset = UIEdgeInsetsZero;
    16          }
    17      }
    18      
    19       // other code here...
    20  }

     

    Added 2014.7.24:

    对于不需要提交到AppStore的应用,还有一个更简单的办法,即覆盖UITableView的私有方法。

    - (BOOL)allowsHeaderViewsToFloat
    {
        return NO;
    }
    
    - (BOOL)allowsFooterViewsToFloat
    {
        return NO;
    }

     

    3、工程地址

    使用iOS 6.1 SDK编译,使用ARC。
    地址:https://github.com/cDigger/CDPullToRefreshDemo

     

     

     

    【参考】

    1、Section Headers in UITableView when inset of tableview is changed

    http://stackoverflow.com/questions/5466097/section-headers-in-uitableview-when-inset-of-tableview-is-changed 

    2、Change Default Scrolling Behavior of UITableView Section Header

    http://stackoverflow.com/questions/664781/change-default-scrolling-behavior-of-uitableview-section-header 

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-10-5 08:34 , Processed in 0.062182 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表