8- 去除UITableView的HeaderView和FooterView的黏性(sticky)[即HeaderView/FooterView跟随UITableView滚动]

Posted on Posted in iOS, 全部文章

前话

前段时间公司要求做一个订单列表页面.里边涉及到了同一个订单下边会有多个商品的情况.最后直接用UITableView添加HeaderView和FooterView解决.但是当时涉及到了一个问题,我们订单的tableView在显示的时候,并不需要类似于<<汽车之家>>那种HeaherView在顶部停留,然后被下边滑动上去的HeaderView替换顶上去的效果,这里我们要提到一个词语交sticky(黏性).我真正需要的是HeaderView随着整个tableView滚动.(FooterView也是同样的道理)

学艺不精,当时这个问题网上查了好久,最后发现答案其实很简单.就是在于我们创建UITableView的时候,指定UITbaleView的UITableViewStyle的属性是UITableViewStyleGrouped还是UITableViewStylePlain.

干货

当我们设置UITableViewStyle为UITableViewStyleGrouped的时候,效果图如下

HeaderView和FooterView的黏性就没有了.

Mou icon

当我们设置UITableViewStyle为UITableViewStylePlain的时候,效果图如下

HeaderView和FooterView的黏性又重新回来.

Mou icon

其它方式

在我最开始寻找解决方案的时候,还在网上看到了另外两种方式尝试解决去掉HeaderView黏性的方法:

第一种通过重写UItableView父类UIScrollView的scrollViewDidScroll方法实现这种效果. ——–>这个方法实现了取消黏性的效果,但是会和我们其他操作相干扰,毕竟他重写的父类的方法.

#pragma mark -- 去掉UItableview headerview黏性(sticky)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    //解决header黏性
    CGFloat sectionHeaderHeight = sectionHeaderViewH;
    if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) {
        scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
    } else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
        scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
}

第二种在自定义HeaderView中,添加以下方法.——–>这个我试验时候,并没有达到去除黏性的效果

- (void)setFrame:(CGRect)frame{
    CGRect sectionRect = [self.tableView rectForSection:self.section];
    CGRect newFrame = CGRectMake(CGRectGetMinX(frame), CGRectGetMinY(sectionRect), CGRectGetWidth(frame),CGRectGetHeight(frame));
    [super setFrame:newFrame];
}

希望能和大家交流技术
欢迎大家关注我的微博和我GitHub,我会不时分享和转发一些大牛的技术贴和开源项目.

新浪微博:http://weibo.com/1594425143/profile?topnav=1&wvr=6&is_all=1

GitHub:https://github.com/lilongcnc


发表评论

电子邮件地址不会被公开。 必填项已用*标注