UIScrollView上下滑动隐藏导航栏或者tabbar的方法思路

通过scrollview实现导航栏和tabbar的隐藏或者其他的联动,一般我们都会想到在scrollviewdidscroll...方法里判断偏移量进行操作,但是scrollviewdidscroll...方法回调的情况分很多种,比如用户拖拽结束scrollview仍然会因为惯性继续滑动等等,总的来说,只要偏移量发生了改变,就会导致scrollviewdidscroll...方法的调用,而一般隐藏导航栏或者tabbar,我们是希望是用户在接触屏幕到离开屏幕这期间来联动导航栏或者tabbar,而惯性导致的偏移量不计算入内。当然还有其他很多乱七八糟的情况,这个给出个解决方案:只要加个判断即可,scrollview能滑动是因为其pan手势,所以加上

if (scrollView.panGestureRecognizer.state == UIGestureRecognizerStateChanged){...}

这样就能排除掉其它情况造成的偏移量,我们需要的只是用户接触屏幕到离开屏幕期间的造成的偏移量变化

//tabbar 和 navigationbar 设置frame动画就行了


- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{

_oldPanOffsetY = [scrollView.panGestureRecognizer translationInView:scrollView.superview].y;

}


#pragma mark -滑动隐藏tabbar功能

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

            if (scrollView.panGestureRecognizer.state == UIGestureRecognizerStateChanged){

            NSLog(@"UIGestureRecognizerStateChanged");

           CGFloat nowPanOffsetY = [scrollView.panGestureRecognizer translationInView:scrollView.superview].y;

           CGFloat diffPanOffsetY = nowPanOffsetY - _oldPanOffsetY;

           CGFloat contentOffsetY = scrollView.contentOffset.y;

          if (ABS(diffPanOffsetY) > 50.f) {

                  [self hideToolBar:(diffPanOffsetY < 0.f && contentOffsetY > 0)];//contentOffsetY > 0 下拉刷新导致的偏移量排除在外

                   _oldPanOffsetY = nowPanOffsetY;

               }

       }

}


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{

_oldPanOffsetY = 0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容