iOS导航栏的几种隐藏方式

作者: 我觉得ok_ | 来源:发表于2017-06-28 18:09 被阅读7752次

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.firstObjectalpha属性,可实现导航栏的渐变效果

首先在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

相关文章

网友评论

    本文标题:iOS导航栏的几种隐藏方式

    本文链接:https://www.haomeiwen.com/subject/fztecxtx.html