项目需求
最近我们商城的app浏览记录页面需要重做,有部分是关于tableView滚动问题。废话不多说先上图。
说一下需求:刚进去的时候,当前显示时间为浏览记录第一组时间,滚动的时候底部在第几组,当前显示时间为第几组的时间。而后台给的数据是没有分组的,整整的一个数组返回来了。
思路过程
首先,我想到的是先去封装数据,封装成以时间为条件,进行分组。然后分组显示。然后再用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];
}
效果图
关键点是当前时间是否显示,方法是两个模型中的时间值比较,如果相同则不显示,不同则显示,当然第一个cell的时间信息必须显示,因为他是第一组嘛。我只留下了关键的代码,其他代码与此功能无关,故删掉了。本人现在独立开发,项目为电商类app,个人感觉功能比较完善,如有兴趣可在appstore中搜索玖陆零。欢迎赐教
参考文档
(http://blog.csdn.net/leejay_carson/article/details/52293313)