自己的导航条与系统UINavigationController的导航条进行自动融合与分离

来源:互联网 发布:重新安装centos u盘 编辑:程序博客网 时间:2024/04/29 09:14

我们在很多APP使用都会遇到,类似的tableview在向上滚动时,会让自己的导航条与系统的UINavigation的titleview进行融合,而当类似的tableview向下滚动时,又会让自己的的导航条与系统的UINavigation的titleview进行分离,另外融合分离会结合一定的滚动或滑动速度,如果慢慢向下滚动或滑动,则不会分离自己的导航条,当速度达到设定的某个值则正式进行分离或融合,另外一般情况下,在分离状态,一般是不可透视的,在融合状态下,是全屏透视的。如以下两图效果






这里的主要实现代码思路如下(这里运用的是通知来实现)
1、在容器中
- (void)viewDidLoad {    [super viewDidLoad];    self.automaticallyAdjustsScrollViewInsets = NO;    [self setupNavBar];    //其他代码    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideNav) name:NavigationBarHiddenNotification object:nil];    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showNav) name:NavigationBarShowNotification object:nil];}- (void)setupNavBar{    self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithImageName:@"nav_item_game_icon-1" highImageName:@"nav_item_game_click_icon-1" target:self action:@selector(test)];    self.navigationItem.rightBarButtonItem = [UIBarButtonItem itemWithImageName:@"RandomAcross" highImageName:@"RandomAcrossClick" target:self action:@selector(randomAcross)];    self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MainTitle"]];}- (void)test{    TGFunc}-(void)randomAcross{    TGFunc    [[NSNotificationCenter defaultCenter] postNotificationName:AcrossEssenceNotification object:nil userInfo:nil];}-(void) hideNav{    if (self.segmentBarVC.segmentBar.superview != self.segmentBarVC.view) return;    self.navigationItem.leftBarButtonItem = nil;    self.navigationItem.rightBarButtonItem = nil;    self.segmentBarVC.segmentBar.backgroundColor = [UIColor clearColor];    self.navigationItem.titleView = self.segmentBarVC.segmentBar;    TGFunc}-(void) showNav{    if (self.segmentBarVC.segmentBar.superview == self.segmentBarVC.view) return;    [self setupNavBar];    self.segmentBarVC.segmentBar.backgroundColor = NavTinColor;    self.segmentBarVC.segmentBar.frame = CGRectMake(0, NavMaxY, self.segmentBarVC.view.width, TitleVH);    [self.segmentBarVC.view addSubview:self.segmentBarVC.segmentBar];    TGFunc}- (void) dealloc{    TGFunc    [[NSNotificationCenter defaultCenter] removeObserver:self name:NavigationBarHiddenNotification object:nil];    [[NSNotificationCenter defaultCenter] removeObserver:self name:NavigationBarShowNotification object:nil];}



2、在tableview中
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{//只会触发上拉加载更多    if (scrollView.contentOffset.y > _contentOffsetY){//上滚        //TGLog(@"up %f",scrollView.contentOffset.y);        if (scrollView.contentOffset.y > 0){            //隐藏,放入nav            //通知形式            //TGLog(@"我要隐藏了~~~~~~~~~~~~ %f",scrollView.contentOffset.y);            if((scrollView.contentOffset.y - _contentOffsetY) > _contentOffsetSpeed && _contentOffsetSpeed>20){//速度超过20隐藏                //TGLog(@"~~~~~~~~~~~~~~~~~~~~~%f %f",scrollView.contentOffset.y - _contentOffsetY,_contentOffsetSpeed);//滚速递减则不再发通知                [[NSNotificationCenter defaultCenter] postNotificationName:NavigationBarHiddenNotification object:nil userInfo:nil];            }            _contentOffsetSpeed = scrollView.contentOffset.y - _contentOffsetY;        }    }else{        //显示,回归原位        //通知形式        //TGLog(@"dwon %f",scrollView.contentOffset.y);        if (scrollView.contentOffset.y > 0){            //TGLog(@"我要显示了^^^^^^^^^^^^^^^^^^^^ %f",scrollView.contentOffset.y);            if (_contentOffsetY - scrollView.contentOffset.y > _contentOffsetSpeed && _contentOffsetSpeed>20){//速度超过20显示                //TGLog(@"^^^^^^^^^^^^^^^^^^^^^^^%f %f",_contentOffsetY - scrollView.contentOffset.y,_contentOffsetSpeed);                [[NSNotificationCenter defaultCenter] postNotificationName:NavigationBarShowNotification object:nil userInfo:nil];            }            _contentOffsetSpeed = _contentOffsetY - scrollView.contentOffset.y;        }else if (fabs(scrollView.contentOffset.y) > NavMaxY && fabs(scrollView.contentOffset.y) < NavMaxY+TitleVH){            //TGLog(@"我要显示了^^^^^^^^^^^^^^^^^^^^ %f",scrollView.contentOffset.y);            [[NSNotificationCenter defaultCenter] postNotificationName:NavigationBarShowNotification object:nil userInfo:nil];        }    }    _contentOffsetY = scrollView.contentOffset.y;}



完整的代码请移步到github,如果你觉得赞,请star
https://github.com/targetcloud/baisibudejie