自己的導航條與系統UINavigationController的導航條進行自動融合與分離

我們在很多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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章