tableView在穿透导航栏以后让section悬浮在导航栏下面

来源:互联网 发布:无广告视频软件 编辑:程序博客网 时间:2024/06/06 03:39

上一篇我提到了让背景图片穿透导航栏,对于tableView来说,他的section会随着tableview的滑动一起滑动,直到当section将要越出在tableView的contentInsets的top时(也就是tableView的内容距离顶部的距离,默认是0,但是如果设置了tableHeaderView,系统会帮我们自动调整为64,这里就会有一个问题,在导航栏透明以及tableView没有滑动时,会有64的留白,所以我们需要设置 self.automaticallyAdjustsScrollViewInsets = NO;,不让系统调整,我们通过监听tableView的滚动自己调整),他就会悬浮在那里,但是当tableView穿透了导航栏以后tableView的farme默认是从0开始计算的,所以section的悬浮就会被NavigationBar给挡住,解决方案如下:
因为tableView继承于UIScrollView,scrollerView中我们用-(void)scrollViewDidScroll:(UIScrollView *)scrollView这个方法来监听scrollerView的时刻滚动,那么我们也可以在这个方法里监听tableView的时刻滚动,当tableView的y偏移小于tableView.tableHeaderView的高度减去64以及tableView的y偏移大于0,设置tableView的内容距离顶部的距离为0,当
tableView的y偏移大于tableView.tableHeaderView的高度-64,也就是section将要穿透navigationBar的时候,设置self.tableView的内容距离顶部的高度为64,这样tableView的内容就会从section就会悬浮在导航栏下面

//LXTableHeaderViewHeight是tableViewHeaderView的高度,注意在设置tableView的tableHeaderView时,虽然在tableView在穿透导航栏的情况下,纵坐标从0开始计算,但是对于tableView的headerView来说,系统还是会自动偏移出64(导航栏44+状态栏20)的高度,所以设置    self.automaticallyAdjustsScrollViewInsets = NO;,这样系统就不会帮我们调整了#pragma mark - UIScrollerViewDelegate-(void)scrollViewDidScroll:(UIScrollView *)scrollView{     //获取tableView当前的y偏移    CGFloat contentOffsety  = scrollView.contentOffset.y;    //如果当前的section还没有超出navigationBar,那么就是默认的tableView的contentInset    if (contentOffsety<=(LXTableHeaderViewHeight-64)&&contentOffsety>=0) {                self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);    }    //当section将要就如navigationBar的后面时,改变tableView的contentInset的top,那么section的悬浮位置就会改变    else if(contentOffsety>=LXTableHeaderViewHeight-64){                self.tableView.contentInset  = UIEdgeInsetsMake(64, 0, 0, 0);    }    if (contentOffsety>60) {         self.testView.backgroundColor =[UIColor colorWithRed:red green:green blue:blue alpha:scale];    }    else{        [self.testView removeFromSuperview];        _testView = nil;    }}
1 0
原创粉丝点击