关于监测tableViewHeaderViewSection滑到顶部问题

项目需求

最近我们商城的app浏览记录页面需要重做,有部分是关于tableView滚动问题。废话不多说先上图。


WX20171114-144306.png

说一下需求:刚进去的时候,当前显示时间为浏览记录第一组时间,滚动的时候底部在第几组,当前显示时间为第几组的时间。而后台给的数据是没有分组的,整整的一个数组返回来了。

思路过程

首先,我想到的是先去封装数据,封装成以时间为条件,进行分组。然后分组显示。然后再用tablView联动原理(主要就是监测tableViewHeaderViewSection有没有滑动到顶部),然后动态改变当前显示时间。但是问题来了,删除功能没法做了。因为button的tag值是NSInteger类型,而NSIndexPath是一个结构体,没法利用tag值将该cell的位置信息传递出去,这一点儿没法绕过,如果不分组的话,将组信息放到cell里,顶部时间动态变化-(void)scrollViewDidScroll:(UIScrollView *)scrollView 监测偏移量会很麻烦,因为每个cell的高度不确定。确实比较棘手。最后想了一种比较好的方法:不去封装数据,将组信息放到cell里,设置tableViewHeaderViewSection,将tableViewHeaderViewSection背景色调成透明色,然后在cell里面做一个假的分割线。点击删除按钮,用tag值indexPath.section传出去。这样就能实现。

最后实现

处理监测tableViewHeaderViewSection是否滑动到顶部

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(nonnull UIView *)view forSection:(NSInteger)section{
    if (self.state == 1) {
        if(!_isUpScroll && (self.tableView.dragging || self.tableView.decelerating)){
            //最上面组头(不一定是第一个组头,指最近刚被顶出去的组头)又被拉回来
            LookListModelData *celldata =self.mutableArray[section];
            self.timeLable.text =[self backTimeString:celldata.addedTime];
        }
    }
}

- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section{
    if (self.state == 1) {
        if((self.tableView.dragging || self.tableView.decelerating)&& _isUpScroll){
            //最上面的组头被顶出去
            if (self.mutableArray.count> section + 1) {
                LookListModelData *celldata =self.mutableArray[section + 1];
                self.timeLable.text =[self backTimeString:celldata.addedTime];
            }
        }
    }
}

// 标记一下RightTableView的滚动方向,是向上还是向下
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    static CGFloat lastOffsetY = 0;
    _isUpScroll = lastOffsetY < scrollView.contentOffset.y;
    lastOffsetY = scrollView.contentOffset.y;
}

__isUpScroll是一个BOLL类型对象,记录是向上向下滑动。LookListModelData *celldata =self.mutableArray[section + 1];
self.timeLable.text =[self backTimeString:celldata.addedTime];这一部分是通过不断的对timeLable赋值,来完成当前时间显示的联动。当然刚进去还没有滚动时,可将当前时间的显示的初始值设置成第一个cell的时间。
<组头信息的处理

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        CollectionTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CollectionCell" forIndexPath:indexPath];
        cell.delegate = self;
        LookListModelData *celldata = self.mutableArray[indexPath.section];
        cell.time.hidden = [self isHiddenTime:indexPath.section];
        return cell;
 }
#pragma mark 是否显示时间
- (BOOL)isHiddenTime:(NSInteger)row {
    LookListModelData *celldata = self.mutableArray[row];
    if (row > 0) {
        LookListModelData *cellda1 = self.mutableArray[row-1];
        if ([[celldata.addedTime substringToIndex:10] isEqualToString: [cellda1.addedTime substringToIndex:10]]) {
            return YES;
        } else {
            return NO;
        }
    } else {
        return NO;
    }
    return YES;
}
#pragma mark 时间格式转换
- (NSString *)backTimeString:(NSString *)time {
    [self.addFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    self.addDate = [self.addFormatter dateFromString:[time substringToIndex:19]];
    [self.addFormatter setDateFormat:@"yyyy年MM月dd日"];
    return [self.addFormatter stringFromDate:self.addDate];
}

效果图


浏览记录gif.gif

关键点是当前时间是否显示,方法是两个模型中的时间值比较,如果相同则不显示,不同则显示,当然第一个cell的时间信息必须显示,因为他是第一组嘛。我只留下了关键的代码,其他代码与此功能无关,故删掉了。本人现在独立开发,项目为电商类app,个人感觉功能比较完善,如有兴趣可在appstore中搜索玖陆零。欢迎赐教🙏🏻🙏🏻

参考文档

(http://blog.csdn.net/leejay_carson/article/details/52293313)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,752评论 4 61
  • 不久九哥便要回天宫了,临走前还问我想好不回家了。 我说,“母后闭门不出,而我与父王也终是生疏了,我回天宫仿佛也没有...
    未慈阅读 1,810评论 0 3
  • 你若没读过这本书,那么多鸡汤都白看了 文/杨熹文 我第一次见毛姆,心中吓了一跳,从未见过有人长相如此刻薄,嘴角下拉...
  • 总有人比你辛苦,也总有人在过着自己想要的生活。总有人过着你想都无法想象的生活,经历你没有过的经历。不要蜷缩在自己...
    兰紫鷊草阅读 1,297评论 0 0
  • 今天 是我试用期最后一天 明天上班就可以正式入职成为实习生了!说真的 以后的工作 让我忐忑 因为今天 我努力了 才...
    小白作者阅读 1,387评论 0 1

友情链接更多精彩内容