1.利用导航栏自带的hidden属性
首先在viewDidLoad
设置
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.navigationBar.hidden = YES;
}
然后在UIScrollView
的代理方法中将其设为NO,代码如下:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat offset=scrollView.contentOffset.y;
if (offset<=0) {
self.navigationController.navigationBar.hidden = YES;
}
else {
self.navigationController.navigationBar.hidden = NO;
}
2.利用navigationController.navigationBar.subviews.firstObject
的alpha
属性,可实现导航栏的渐变效果
首先在viewDidLoad
设置
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.navigationBar.translucent = YES;
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"top_titil_bj"] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
_barImageView = self.navigationController.navigationBar.subviews.firstObject;
_barImageView.alpha = 0;
UILabel *titleLabel = [[UILabel alloc]init];
titleLabel.text = @"我的";
[titleLabel sizeToFit];
self.navigationItem.titleView = titleLabel;
self.navigationItem.titleView.alpha = 0;
}
同理在UIScrollView
的代理方法scrollViewDidScroll
里做操作,代码如下:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
_barImageView = self.navigationController.navigationBar.subviews.firstObject;
CGFloat minAlphaOffset = 0;
CGFloat maxAlphaOffset = 50;
CGFloat offset = scrollView.contentOffset.y - JBScreenHeight;
CGFloat alpha = (offset - minAlphaOffset) / (maxAlphaOffset - minAlphaOffset);
_barImageView.alpha = alpha;
self.navigationItem.titleView.alpha = alpha;
}
- 在这里发现一个无解的问题:当
push
进一个页面再返回时,需要将标题栏隐藏,但是我在viewWillAppear
设置:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
self.navigationItem.titleView.alpha = 0;
}
发现不起作用,花费了我好几个小时发现要这样写才有效果:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
__weak typeof(self)weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.navigationItem.titleView.alpha = 0;
});
}
顿时黑人问号❓❓❓,这里本来就是主线程好嘛,问题总算解决了
- 代码下载:点这
3.第三方
JZNavigationExtension一个不错的第三方,只需一句代码:
self.jz_navigationBarBackgroundAlpha = alpha;
即可实现导航栏透明度变化,同时支持手势滑动,具体使用作者在GitHub
也有介绍
总结
1、2 方法只适用于界面是
UIScrollView
或者UITableView