通过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;
}