我们在很多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];
}
- (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