今天我的同事遇到一个需求,需要在上滑的时候显示导航栏,下滑的时候隐藏导航栏。
监听上滑与下滑这个动作,怎么实现?
方案一
通过偏移量量计算,可以实现。问题是实时性太高。如果使用MJRefresh框架时,有上下拉刷新的动画,这个也会触发这种监听。
方案二
其次同事想到监听这个偏移位置,如果越过如200这个位置,我们才做操作。这个方法可以避开动画刷新。但是,当可滑动区域足够大呢?上滑显示,很难滑到这个位置。
方案三
其次,我想到touchBegan 与touchEnded的方法,但是我很快发现:tableView的这个方法并不执行。而且是我创建的自定义tableView也不执行。
查资料:tableView不响应对应的touch事件方法
这个链接里说采取手势的方法,但是这个也有缺陷。如果tableView上有可以响应的按钮,手势响应会替代这个按钮响应、
方案四
监听移动位移偏移量,向上或者向下移动大于200,执行不同的对应操作。
首先:在scrollViewWillBeginDragging开始前记录好滑动的最初位置
然后在滑动过程中进行判断:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
// NSLog(@"Scrolling:%f,%f",scrollView.contentOffset.x,scrollView.contentOffset.y);
if(scrollView.contentOffset.y -self.oldY > 200){
self.oldY = scrollView.contentOffset.y;
NSLog(@"下滑隐藏!");
[self.table mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view);
}];
}
if(scrollView.contentOffset.y- self.oldY < -200){
self.oldY = scrollView.contentOffset.y;
NSLog(@"上滑显示!");
[self.table mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view).offset(44);
}];
}
}
为什么选择200,因为在我测试下拉的时候,最大限度的弹簧效果差不多在-190~-196之间,选择200正好避免这种情况。
最终:同事在方案二中在界面底部加了一个上滑到顶部的按钮。