我們在很多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